python python自定义迭代器 python生成器输出 - 如何并行迭代两个列表?




4 Answers

for f, b in zip(foo, bar):
    print(f, b)

当较短的foobar停止时zip停止。

Python 2中zip返回一个元组列表。 当foobar不是很大时,这很好。 如果它们都很庞大,那么形成zip(foo,bar)是一个不必要的大量临时变量,应该由itertools.izipitertools.izip_longest替换,它将返回一个迭代器而不是一个列表。

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

foobar耗尽时, izip停止。 当foobar都耗尽时, izip_longest停止。 当较短的迭代器耗尽时, izip_longest在与该迭代器相对应的位置产生一个带有None的元组。 如果您愿意,您还可以设置不同的fillvalue 。 看到这里的全部故事

Python 3中zip返回元组的迭代器,如Python2中的itertools.izip 。 要获取元组列表,请使用list(zip(foo, bar)) 。 并且要压缩,直到两个迭代器都耗尽,您可以使用itertools.zip_longest

还要注意, zip和其类似zip的brethen可以接受任意数量的迭代作为参数。 例如,

for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

版画

1 red manchego
2 blue stilton
3 green brie
python迭代器长度 __iter__用法

我在Python中有两个迭代器,我想对它们进行比较:

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print "f: ", f, "; b: ", b

它应该导致:

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

一种方法是迭代索引:

for i in xrange(len(foo)):
    print "f: ", foo[i], "; b: ", b[i]

但是这对我来说似乎有些不和谐。 有没有更好的方法来做到这一点?




内置zip正是你想要的。 如果你想要迭代而不是列表,你可以看看itertools.izip,它可以做同样的事情,但一次给出一个结果。




你应该使用' zip '功能。 这里是你自己的zip函数的样子

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)



def ncustom_zip(seq1,seq2,max_length):
        length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2)
        for i in range(length):
                x= seq1[i] if len(seq1)>i else None  
                y= seq2[i] if len(seq2)>i else None
                yield x,y


l=[12,2,3,9]
p=[89,8,92,5,7]

for i,j in ncustom_zip(l,p,True):
        print i,j
for i,j in ncustom_zip(l,p,False):
        print i,j



Related