2012-07-09 22 views
6

说我有两个列表:的Python:生产列表,它是两个列表的总和,项目明智

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] 

(这显然返回不是我想要的)

+0

这不是很明显我分配给'C'的结果会是什么,所以我试图在IDLE和C'的'用于说明目的的价值粘贴。 – 2012-07-09 22:12:12

回答

21

使用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 

这意味着,从a1,然后遍历的b所有元素,同时将其添加到1,然后选择从a2,然后再通过b所有值循环而将它们添加到2,这就是为什么你没有得到预期的产出。

+0

击败我15秒。 +1,我会删除我的。 – mgilson 2012-07-09 20:58:36

+1

应该不鼓励在范围(len(a))中使用'for i,使用迭代器更好。 – PaulMcG 2012-07-09 21:18:46

+1

做了一些'timeit',并且在测试了这个网站上的所有解决方案之后,最快的是'starmap(add,zip(a,b))',时钟频率为0.65s。上述解决方案分别为1.18s和0.94s。 – 2012-07-09 21:23:58

-1

我不知道你在做什么,但你可以很容易地做你所要求的numpy。我只是不确定你是否真的想将额外的依赖添加到你的代码中。

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

感谢 - 点...不知道为什么这正是他要求的... – 2012-07-09 20:59:25

+0

这是不正确的。 'range()'接受一个整数,而不是一个列表:http://ideone.com/bnDMC。您应该使用len(a)。 – C0deH4cker 2012-07-09 21:00:34

+0

哦,是的,你的权利...打字速度太快...固定...(但它也包括以下在Ashwini乔德里的职位) – 2012-07-09 21:00:56

2
[ay + be for ay, be in zip(a, b)] 
5
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] 
+0

“map()”为+1。 – 2012-07-09 21:16:48

+1

对于具有多个序列的'map()'+1,这隐含地做了一个'izip_longest'。 – PaulMcG 2012-07-09 22:11:05