假设我有两个列表:
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]
(显然,它返回的不是我想要的内容)
假设我有两个列表:
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]
使用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中。这就是为什么您没有得到预期输出的原因。for i in range(len(a))
,使用迭代器是更好的实践。 - PaulMcGtimeit
测试后,发现在这个网站上测试所有的解决方案中,最快的是 starmap(add, zip(a, b))
,耗时为0.65秒。而上述的解决方案分别耗时1.18秒和0.94秒。 - Joel Cornetta=[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]
map()
,可以隐式执行izip_longest
,这是一个加分项。 - PaulMcG[ay + be for ay, be in zip(a, b)]
sums = [a[i]+b[i] for i in range(len(a))]
range()
需要一个整数而不是一个列表:http://ideone.com/bnDMC。你应该使用`len(a)`代替。 - C0deH4ckerfor 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我不知道你想做什么,但是你可以很容易地使用numpy完成你所要求的操作。只是我不确定你是否真的想在你的代码中添加这个额外的依赖。
c
的结果并不明显,所以我在IDLE中尝试了一下,并粘贴了c
的值以说明问题。 - Iain Samuel McLean Elder