我试图创建一个代码块,我可以在其中添加两个包含整数的列表。也就是说,如果列表a = [1,2,3]并且列表b = [4,5,6],那么我想指定一个列表c,它添加(a[0]+b[0], a[1]+b[1], a[2]+b[2])
以便c = [5,7,9]
。
这是我的尝试,但c仍然是一个空列表:
a = [1, 2, 3]
b = [4, 5, 6]
c = []
for i in a:
for j in b:
if i == j:
d = a[i]+b[j]
e = c.append(d)
我应该改变什么?
答案 0 :(得分:9)
<item name="textSizeTertiary">18sp</item>
可以解决问题:
zip()
[5,7,9]
答案 1 :(得分:3)
如果您编写for i in a
,则会迭代列表中的元素。因此j
将采用值4
,5
和6
。这些永远不会匹配i
的值。
我们可以使用range
来更改它,我们可以编写for i in range(len(a))
,但这样效率很低:我们将迭代a
的一个元素的每个可能组合b
。这将导致 O(mn)算法, m a
中的元素数量, n 的数量b
中的元素。
zip(..)
函数要同时迭代迭代,我们可以使用zip(..)
。 zip
将一个或多个iterables作为输入。然后它将构造元组。因此,如果我们执行zip(a, b)
,我们将生成一个迭代,其后会生成(a[0], b[0])
,然后是(a[1], b[1])
,然后是(a[2], b[2])
,依此类推。
现在我们可以将其重写为:
c = []
for ai, bi in zip(a, b):
c.append(ai + bi)
可以使用 list comprehension 将其重写为:
c = [ai + bi for ai, bi in zip(a, b)]
我们还可以使用operator
模块并使用operator.add
和map
以更实用的方式编写它:
from operator import add
c = list(map(add, a, b))
因为一切都是动态的,所以重要的是要注意它在Haskell中的对象是可变的意义上不起作用,因此我们不能保证不存在副作用这一事实。
答案 2 :(得分:3)
这是另一种使用zip,内置和函数和列表理解
的替代方法a = [1, 2, 3]
b = [4, 5, 6]
c = [ sum(x) for x in zip(a,b) ]
print c
结果是[5,7,9]
答案 3 :(得分:2)
另一种选择。
import numpy as np
a = [1, 2, 3]
b = [4, 5, 6]
np.sum((a, b), axis=0) # array([5, 7, 9])
由于OP正在学习python,这不是特别有用。但我在此处将其包含在内,以表明有多种方法可以实现相同的目标。
numpy
专为优化数值计算而设计。