def run(first, second):
sum=[]
for i in range(len(first)):
third.append(second[i]+first[i])
return sum
print run([1,2,3],[10,20,30])
该代码工作正常,并打印出一个包含三个元素的列表,其中每个元素是“第二”和“第一”中相同索引的两个元素的总和,特别是[11, 22, 33]
. 有没有更直接的方法来返回相同的结果?
def run(first, second):
sum=[]
for i in range(len(first)):
third.append(second[i]+first[i])
return sum
print run([1,2,3],[10,20,30])
该代码工作正常,并打印出一个包含三个元素的列表,其中每个元素是“第二”和“第一”中相同索引的两个元素的总和,特别是[11, 22, 33]
. 有没有更直接的方法来返回相同的结果?
并且只是指出另一种方式,它绕过 zip,但确实引入了地图......(有些人发现可读性较差或不喜欢......)
from operator import add
third = map(add, first, second)
Martijn 发布的最简单的选项:
def run(a, b):
return [x + y for x, y in zip(a, b)]
一种可能的改进是使其适用于任意数量的列表,而不仅仅是两个:
def run(*args):
return [sum(p) for p in zip(*args)]
另一个概括是允许其他运算符:
def run(func, *args):
return map(func, *args)
然后,例如:
import operator
print run(operator.add, [1,2,3],[10,20,30]) # [11, 22, 33]
print run(operator.sub, [1,2,3],[10,20,30]) # [-9, -18, -27]
请注意,在所有三种情况下,run
都不需要单独的函数,可以简单地用内置调用替换。
另一种方法是使用map
- 尽管注意处理不同列表长度之间的差异zip
以及map
处理不同列表长度时的差异很有趣。
我认为在大多数情况下@Marijn Pieterszip
解决方案会做你想要的,因为zip
它在处理列表时更加可爱和柔软。
In [414]: first = [1,2,3]
In [415]: second = [10,20,30]
In [416]: [a + b for a, b in zip(first, second)]
Out[416]: [11, 22, 33]
In [417]: import operator
In [418]: map(operator.add, first, second)
Out[418]: [11, 22, 33]
In [419]: second = [10,20,30,40]
In [420]: [a + b for a, b in zip(first, second)]
Out[420]: [11, 22, 33]
In [421]: map(operator.add, first, second)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-421-dd15f26f1e89> in <module>()
----> 1 map(operator.add, first, second)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
In [422]: map(None, first, second)
Out[422]: [(1, 10), (2, 20), (3, 30), (None, 40)]