0

2 つのイテレータから交互に値を取得する次の python スクリプトがあります。

filename = "small"
with open(filename,'r') as plot_data:
    main_dict = dict()
    line_one = itertools.islice(plot_data, 0, None, 4)
    line_two = itertools.islice(plot_data, 2, None, 4)
    dictionary = defaultdict(list)
    #take values from iterators alternatively.
    for movie_name, movie_plot in itertools.izip(line_one, line_two):
        movie_plot = movie_plot.lower()
        words = re.findall(r'\w+', movie_plot, flags = re.UNICODE | re.LOCALE)
        elemStopW = filter(lambda x: x not in stopwords.words('english'), words)
        #list of words.
        print elemStopW
        for word in elemStopW:
            word = PorterStemmer().stem_word(word)
            dictionary[movie_name].append(word)
            main_dict[word] = len(main_dict)
    print main_dict 

このスクリプトは何も出力していません。私はなぜなのか理解していない。同じループで両方の値を使用したいので、イテレータをマージしたくありません。

どんな助けでも感謝します。

編集:(コメントのように)クリアランスを避けるため。次のスクリプトは正常に動作します

filename = "small"
with open(filename,'r') as plot_data:                    
        main_dict = dict()
        line_one = itertools.islice(plot_data, 0, None, 4)
        dictionary = defaultdict(list)                                                                      
        for movie_name in line_one:                                                           
                print movie_name  
4

1 に答える 1

2

これはおそらくあなたが期待することをしないでしょう:

line_one = itertools.islice(plot_data, 0, None, 4)
line_two = itertools.islice(plot_data, 2, None, 4)

はファイル オブジェクトであるためplot_data、いずれかのイテレータから読み取ると、ファイルが進められます。ファイルは、2 回並列に読み取られるのではなく、順次読み取られます。

を使用itertools.teeして、ファイル イテレータを複製して、2 回並行して読み取ることができます。

plot1, plot2 = itertools.tee(plot_data, 2)
line_one = itertools.islice(plot1, 0, None, 4)
line_two = itertools.islice(plot2, 2, None, 4)

2 つのイテレータの位置が互いに大きくずれることがある場合、大量のメモリが必要になる可能性があるため、ファイルを 2 回開いた方がよいことに注意してください。この場合、これは問題になりません。

于 2013-04-07T09:10:54.697 に答える