Python:生成一个由两个列表逐项相加而成的列表

7

假设我有两个列表:

a=[1,2,3,4,5]
b=[5,4,3,2,1]

我希望创建第三个值,它将是两个给定值的线性和:
c[i]==a[i]+b[i]
c==[6,6,6,6,6]

能否使用 “for” 构造器实现呢?就像这样:

c = [aa+bb for aa in a for bb in b]

(显然,它返回的不是我想要的内容)

对我来说,将值赋给c的结果并不明显,所以我在IDLE中尝试了一下,并粘贴了c的值以说明问题。 - Iain Samuel McLean Elder
5个回答

25

使用zip():

>>> a = [1,2,3,4,5]
>>> b = [5,4,3,2,1]
>>> c = [x+y for x,y in zip(a, b)]
>>> c
[6, 6, 6, 6, 6]

或:

>>> c = [a[i] + b[i] for i in range(len(a))]
>>> c
[6, 6, 6, 6, 6]

c = [aa+bb for aa in a for bb in b]的意思是:

 for aa in a:
     for bb in b:
           aa+bb
这意味着,从表a中选择1,然后循环遍历表b的所有元素,将它们添加到1中,然后再从表a中选择2,再次循环遍历表b的所有值,将它们添加到2中。这就是为什么您没有得到预期输出的原因。

比我快了15秒。+1,我就删掉我的。 - mgilson
1
应该避免使用 for i in range(len(a)),使用迭代器是更好的实践。 - PaulMcG
2
做了一些timeit测试后,发现在这个网站上测试所有的解决方案中,最快的是 starmap(add, zip(a, b)),耗时为0.65秒。而上述的解决方案分别耗时1.18秒和0.94秒。 - Joel Cornett

6
a=[1,2,3,4,5]
b=[5,4,3,2,1]

[x+y for x,y in zip(a,b)]
[6, 6, 6, 6, 6]

OR

map(lambda x,y:x+y, a, b)
[6, 6, 6, 6, 6]

2
对于使用多个序列的map(),可以隐式执行izip_longest,这是一个加分项。 - PaulMcG

2
[ay + be for ay, be in zip(a, b)]

1
 sums =   [a[i]+b[i] for i in range(len(a))]

感谢您的贡献,虽然我不知道为什么这正是他所要求的... - Joran Beasley
这是不正确的。range()需要一个整数而不是一个列表:http://ideone.com/bnDMC。你应该使用`len(a)`代替。 - C0deH4cker
快速修复,取消了踩的操作。 - C0deH4cker
99%的情况下,你会使用for i in range(10): a[i]的代码可以替换为for item in a:或者for i,item in enumerate(a):。让我们提供Pythonic用法的好例子,而不是从旧语言中借鉴的hack-ey习语。 - PaulMcG
你能指导我有关必须尽量避免的事项吗?我认为[a[i]+b[i] for i in range(len(a))]['item+b[i] for i,item in enumerate(a)]更易读,而且Python鼓励代码的易读性... 然而,这两种方式的功能是相同的(也许时间复杂度也类似)。 - Joran Beasley
显示剩余5条评论

-2

我不知道你想做什么,但是你可以很容易地使用numpy完成你所要求的操作。只是我不确定你是否真的想在你的代码中添加这个额外的依赖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接