0

我有以下 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是一个文件对象,因此从任一迭代器读取都会推进文件 - 它仍将按顺序读取,而不是并行读取两次。

您可以使用itertools.tee复制文件迭代器,以便可以并行读取两次:

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

请注意,如果两个迭代器的位置可能会相差很远,这可能会占用大量内存,并且您最好打开文件两次。在这种情况下,这应该不是问题。

于 2013-04-07T09:10:54.697 回答