1
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]. 有没有更直接的方法来返回相同的结果?

4

5 回答 5

2

当然,使用zip()内置函数列表推导

def run(first, second):
    return [a + b for a, b in zip(first, second)]

演示:

>>> def run(first, second):
...     return [a + b for a, b in zip(first, second)]
... 
>>> print run([1,2,3],[10,20,30])
[11, 22, 33]
于 2013-02-04T12:52:02.943 回答
2

并且只是指出另一种方式,它绕过 zip,但确实引入了地图......(有些人发现可读性较差或不喜欢......)

from operator import add
third = map(add, first, second)
于 2013-02-04T13:00:05.877 回答
0

您可以使用内置函数mapsumzip

>>> map(sum, zip([1, 2, 3], [10, 20,30]))
[11, 22, 33]
于 2013-02-04T12:59:05.770 回答
0

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都不需要单独的函数,可以简单地用内置调用替换。

于 2013-02-04T13:01:11.480 回答
0

另一种方法是使用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)]
于 2013-02-04T13:09:07.013 回答