Python:你能按元素添加两个列表吗?

时间:2017-11-22 04:20:05

标签: python list

你可以逐个元素地添加两个列表,而不是如下所示迭代它吗?这有效,但是呃。我想念matlab。

list1 = [3, 7, 3]
list2 = [4, 5, 6]

for x in range(0, len(list1)): 
   list1[x] = list1[x] + list2[x]

print (list1)

Output :
[7, 12, 9]

5 个答案:

答案 0 :(得分:3)

不要错过Matlab :) numpy数组是典型的Matlab数组:

arr1 = np.array([3, 7, 3])
arr2 = np.array([4, 5, 6])
arr1 + arr2

给你你想要的东西。

如果你想坚持使用列表,你可以这样做:

list1 = [3, 7, 3]
list2 = [4, 5, 6]
[sum(x) for x in zip(list1, list2)]

在表演评论之后,特别是Patrick的比较,我自己做了一个比较,并证实numpy实际上是当前解决方案中最快的。然而,还有另一个解决方案,胜过numpy!我们来看看:

# Numpy:
timeit arr1 + arr2 # 1.67 µs per loop
# List comprehension:
timeit [sum(x) for x in zip(list1, list2)] # 2.59 µs per loop
timeit [(x+y) for x,y in zip(list1,list2)] # 1.72 µs per loop
# Map and Reduce-based (note that reduce is really overkill, I did it just for fun):
timeit map(sum, zip(list1, list2)) # 2.58 µs per loop
timeit map(lambda a, b: a + b , list1, list2) # 2.11 µs per loop
timeit [reduce((lambda x,y: x+y), e) for e in zip(list1,list2)] # 4.05 µs per loop
# And the winner:
from operator import add
timeit map(add, list1, list2) # 1.57 µs per loop

答案 1 :(得分:1)

zip列表一起,sum

list(map(sum, zip(list1, list2)))

编辑:

我做了一些基本的测试,如果输入数据以列表形式开始,压倒性的获胜者是列表理解,如果你可以在操作之前将它作为数组,则numpy

def test1(list1, list2):
  l=[]
  for x in range(0, len(list1)):
    l.append(list1[x] + list2[x])
  return l    

def test2(list1, list2):
  return list(map(sum, zip(list1, list2)))

def test3(list1, list2):
  return [x+y for x, y in zip(list1, list2)]

import numpy as np

def test4(list1, list2):
  return np.array(list1) + np.array(list2)

def test5(list1, list2):
  return list1 + list2

from timeit import timeit

print(timeit('test1(list1, list2)', setup='list1 = list(range(100)); list2 = list(range(100))', globals=globals()))
print(timeit('test2(list1, list2)', setup='list1 = list(range(100)); list2 = list(range(100))', globals=globals()))
print(timeit('test3(list1, list2)', setup='list1 = list(range(100)); list2 = list(range(100))', globals=globals()))
print(timeit('test4(list1, list2)', setup='list1 = list(range(100)); list2 = list(range(100))', globals=globals()))
print(timeit('test4(list1, list2)', setup='list1 = np.array(list(range(100))); list2 = np.array(list(range(100)))', globals=globals()))
print(timeit('test5(list1, list2)', setup='list1 = np.array(list(range(100))); list2 = np.array(list(range(100)))', globals=globals()))

给我

15.42712744511664 # append
17.329718918073922 # my solution above
7.0252319818828255 # list comprehension
16.53089915495366 # numpy with list inputs
1.430903600063175 # numpy with array inputs that are double checked
0.6451617309357971 # numpy assuming array inputs

这些是执行操作1000000次的秒数。

每次被迫np.array(list)时,Numpy的速度都非常慢。

this repl.it

处自行尝试

答案 2 :(得分:1)

如果您想要类似matlab的行为,则应使用numpy

In [5]: list1 = [3, 7, 3]

In [6]: list2 = [4, 5, 6]

In [7]: import numpy as np

In [8]: np.array(list1) + np.array(list2)
Out[8]: array([ 7, 12,  9]

答案 3 :(得分:1)

您还可以在列表

上使用列表理解
list1 = [3, 7, 3]
list2 = [4, 5, 6]
list3 = [(x+y) for x,y in zip(list1,list2)]
print(list3)

输出:

[7, 12, 9]

答案 4 :(得分:1)

您可以使用 lambda 地图

>>> list1 = [3, 7, 3]
>>> list2 = [4, 5, 6]
>>> list(map(lambda a, b: a + b , list1, list2))
[7, 12, 9]