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

4 投票
5 回答
7928 浏览
提问于 2025-04-17 05:18

我有两个列表:

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

撰写回答