说我有2个列表:
A = [a1,a2,a3,...,an]
B = [b1,b2,b3,...,bn]
列表是一对一的。
那么如何创建一个操作的循环(任何操作):
a1 with b1
a2 with b2
...
an with bn
由于您的列表是一对一的,因此它们的大小必须相同。在这种情况下,zip()
是这里的最佳选择。此功能使迭代器并从每个迭代中汇总成元组成对:
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> zipped = zip(a, b)
>>> print(list(zipped))
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> print(tuple(zipped))
((1, 5), (2, 6), (3, 7), (4, 8))
这意味着您可以在拉链中的每个元素上应用功能:
>>> print([sum(x) for x in zipped])
[6, 8, 10, 12]
>>> print([max(x) for x in zipped])
[5, 6, 7, 8]
您也可以使用map()
实现类似的行为:
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> print(list(map(lambda x, y : x + y, a, b)))
[6, 8, 10, 12]
>>> print(list(map(lambda x, y : x * y, a, b)))
[5, 12, 21, 32]
我还建议使用迭代器编写zip()
功能,以查看其工作原理:
def my_zip(seq1, seq2):
i1 = iter(seq1)
i2 = iter(seq2)
while True:
yield next(i1), next(i2)
此外,另一种不太首选的方法是循环第一个列表,并使用这些索引也访问第二个列表中的元素:
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> for i in range(len(a)):
print(a[i], b[i])
1 5
2 6
3 7
4 8
>>> print([a[i] + b[i] for i in range(len(a))])
[6, 8, 10, 12]
这不是很好的Pythonic,但也有效。我建议对此使用zip()
。
使用 zip
a = [1,2,3];
b = [4,5,6];
for x,y in zip(a,b):
print x,y;
只是要处理:
for ea, eb in zip(A, B):
f(ea, eb)
如果要保持结果,
[f(ea, eb) for ea, eb in zip(A, B)]
zip
内置的in缝在一起将两个或多个列表缝制到一个元素列表中,然后我们可以通过显式循环或通过理解来迭代。