在两个列表中找到匹配组件的总和
我有两个列表:
A = [1, 2, 3, 4, 5]
B = [6, 7, 8, 9, 10]
我需要能够找到这两个列表中第n个元素的和,也就是说,像1+6,2+7,3+8这样的计算。
有人能告诉我怎么同时访问这两个列表中的元素吗?
我看到有人说可以用Sum = a[i] + b[i]来实现,但我不太明白这具体是怎么工作的。
5 个回答
13
使用列表推导式和 zip
函数:
[a + b for (a,b) in zip(A,B)]
这些问题是作业吗?还是自学的内容?
15
>>> import operator
>>> map(operator.add, A, B)
[7, 9, 11, 13, 15]
只是为了展示一下Python的优雅之处:-)
0
如果你知道两个列表的长度是一样的,可以这样做:
AB = [A[i] + B[i] for i in range(len(A))]
在Python 2中,如果你的列表很大,可能想用 xrange
代替 range
。我觉得这是一个明确、简单、易读、显而易见的方法,不过有些人可能会有不同的看法。
如果列表的长度可能不同,你需要决定如何处理多出来的元素。假设你想忽略较长列表中的多余元素。这里有三种方法可以做到:
AB = [A[i] + B[i] for i in range(min(len(A), len(B)))]
AB = map(sum, zip(A, B))
AB = [a + b for a, b in zip(A, B)]
使用 zip
的缺点是它会分配一个包含元组的列表,如果你的列表已经很大,这会占用很多内存。使用 for i in xrange
和下标访问不会占用那么多内存,或者你可以使用 itertools.izip
:
import itertools
AB = map(sum, itertools.izip(A, B))
如果你想假装较短的列表是用零填充的,使用 itertools.izip_longest
是最简单的答案:
import itertools
AB = map(sum, itertools.izip_longest(A, B, fillvalue=0))
或者
import itertools
AB = [a + b for a, b in itertools.izip_longest(A, B, fillvalue=0)]