查找两个列表中匹配组件的总和

时间:2011-10-30 21:43:09

标签: python list sum

我有两个清单:

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 个答案:

答案 0 :(得分:15)

>>> import operator
>>> map(operator.add, A, B)
[7, 9, 11, 13, 15]

只是为了展示Pythons的优雅: - )

答案 1 :(得分:13)

使用列表推导和zip

[a + b for (a,b) in zip(A,B)]

这些问题是作业吗?还是自学?

答案 2 :(得分:0)

如果你知道列表长度相同,你可以这样做:

AB = [A[i] + B[i] for i in range(len(A))]

在Python 2中,如果您的列表非常大,则可能需要使用xrange而不是range。我认为这是explicit, simple, readable, obvious way,但有些可能会有所不同。

如果列表的长度可能不同,则必须决定如何处理额外的元素。假设你想忽略任何列表更长的额外元素。这有三种方法:

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)]

答案 3 :(得分:0)

虽然Jazz的解决方案适用于2个列表,但如果您有2个以上的列表怎么办?这是一个解决方案:

def apply_elementwise_function(elements_in_iterables, function):
    elementwise_function = lambda x, y: itertools.imap(function, itertools.izip(x, y))
    return reduce(elementwise_function, elements_in_iterables)

a = b = c = [1, 2, 3]
>>> list(apply_elementwise_function([a, b, c], sum))
[3, 6, 9]

答案 4 :(得分:-1)

您好你也可以试试这个:

>>>a=[1,2,3,4,5]
>>>b=[6,7,8,9,10]
>>>c=[]
>>>for i in range(0,5):
    c.append(a[i]+b[i])
>>> c
[7, 9, 11, 13, 15]