如何并行迭代两个列表?

我在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) 

zipfoobar的较短部分停止时停止。

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

 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可以接受任意数量的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 

你想要的zipfunction。

 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