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)
当foo
或bar
的较短者停止时, zip
停止。
在Python 3 中 , zip
返回一个元组的迭代器,就像 Python2 中的itertools.izip
一样。要获取元组列表,请使用list(zip(foo, bar))
。要压缩直到两个迭代器都用尽,可以使用itertools.zip_longest 。
在Python 2 中 , zip
返回一个元组列表。当foo
和bar
不大时,这很好。如果它们都是大规模的,则形成zip(foo,bar)
就是不必要的大规模临时变量,应将其替换为itertools.izip
或itertools.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)
当foo
或bar
用尽时, izip
停止。当foo
和bar
都用尽时, izip_longest
停止。当较短的迭代器用尽时, izip_longest
生成一个在与该迭代器相对应的位置具有None
的元组。如果需要,您还可以设置除None
以外的其他fillvalue
。看到这里的完整故事 。
还要注意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
功能。
for (f,b) in zip(foo, bar):
print "f: ", f ,"; b: ", b
您应该使用 “ zip ” 功能。这是您自己的 zip 函数的外观示例
def custom_zip(seq1, seq2):
it1 = iter(seq1)
it2 = iter(seq2)
while True:
yield next(it1), next(it2)
这是使用列表理解的方法:
a = (1, 2, 3)
b = (4, 5, 6)
[print('f:', i, '; b', j) for i, j in zip(a, b)]
印刷品:
f: 1 ; b 4
f: 2 ; b 5
f: 3 ; b 6
Python3 参考
多处理 。
from itertools import zip_longest
from multiprocessing.dummy import Pool as ThreadPool
try:
l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
def f(x):
print(x)
pool = ThreadPool()
zipped = list(zip_longest(l1, l2, fillvalue='na'))
results = pool.map(f, zipped)
pool.close()
pool.join()
except Exception as e:
print(e)