Вопрос-Ответ

Element-wise addition of 2 lists?

Поэлементное добавление 2 списков?

Теперь у меня есть:

list1 = [1, 2, 3]
list2 = [4, 5, 6]

Я хотел бы иметь:

[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]

Просто поэлементное добавление двух списков.

Я, конечно, могу повторить два списка, но я не хочу этого делать.

Какой самый питонический способ для этого?

Переведено автоматически
Ответ 1

Использовать map с operator.add:

>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]

или zip с пониманием списка:

>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]

Сравнение времени:

>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop
Ответ 2

Другие приводили примеры, как это сделать на чистом python. Если вы хотите сделать это с массивами из 100.000 элементов, вам следует использовать numpy:

In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])

Выполнение поэлементного добавления теперь так же тривиально, как

In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]

точно так же, как в Matlab.

Время для сравнения с самой быстрой версией Ashwini:

In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop

In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop

Итак, это в 25 раз быстрее! Но используйте то, что подходит вашей ситуации. Для простой программы вы, вероятно, не хотите устанавливать numpy, поэтому используйте стандартный python (и я нахожу, что версия Генри самая питонистская). Если вы серьезно занимаетесь обработкой чисел, давайте numpy сделаем тяжелую работу. Для любителей скорости: кажется, что решение numpy работает быстрее, начиная с n = 8.

Ответ 3
[a + b for a, b in zip(list1, list2)]
Ответ 4

Как описано другими, быстрым и к тому же экономичным решением является использование numpy (np) со встроенной возможностью управления векторами:

1. С помощью Numpy

x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y

2. Со встроенными

2.1 Лямбда

list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)

Обратите внимание, что map() поддерживает несколько аргументов.

2.2 понимание zip и списков

list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]
python list