如何并行迭代两个列表?
我在Python中有两个iterables,我想成对地去看看它们:
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]
但是这对我来说似乎有些不合理。 有没有更好的方法来做到这一点?
for f, b in zip(foo, bar): print(f, b)
zip
在foo
或bar
的较短部分停止时停止。
在Python 2中 , zip
返回一个元组列表。 当foo
和bar
不是很大的时候,这很好。 如果它们都很庞大,那么形成zip(foo,bar)
是一个不必要的巨大临时variables,应该由itertools.izip
或itertools.izip_longest
replace,它将返回一个迭代器而不是一个列表。
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)
当foo
或bar
耗尽时, izip
停止。 当foo
和bar
都耗尽时, izip_longest
停止。 当较短的迭代器耗尽时, izip_longest
在对应于该迭代器的位置产生一个None
的元组。 如果您愿意,也可以设置不同的fillvalue
。 看到这里的全部故事 。
在Python 3中 , zip
返回元组的迭代器,如Python2中的itertools.izip
。 要获取元组列表,请使用list(zip(foo, bar))
。 要压缩,直到两个迭代器都耗尽,您可以使用itertools.zip_longest 。
还要注意的是, zip
和其类似zip
的brethen可以接受任意数量的iterables作为参数。 例如,
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
你想要的zip
function。
for (f,b) in zip(foo, bar): print "f: ", f ,"; b: ", b
内置zip
正是你想要的。 如果你想要迭代而不是列表,你可以看看itertools.izip,它做同样的事情,但一次给出一个结果。
你在找什么叫做zip
。
你应该使用“ zip ”function。 这里是你自己的zip函数的样子
def custom_zip(seq1, seq2): it1 = iter(seq1) it2 = iter(seq2) while True: yield next(it1), next(it2)
zip函数解决了这个问题
文档: ZIP库function
AIM:并排输出问题:
#value1 is a list value1 = driver.find_elements_by_class_name("review-text") #value2 is a list value2 = driver.find_elements_by_class_name("review-date") for val1 in value1: print(val1.text) print "\n" for val2 in value2: print(val2.text) print "\n"
输出:
review1
review2
review3
DATE1
DATE2
DATE3
解:
for val1, val2 in zip(value1,value2): print (val1.text+':'+val2.text) print "\n"
输出:
review1:DATE1
review2:DATE2
review3:DATE3