Теперь у меня есть:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Я хочу иметь:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Просто поэлементное добавление двух списков.
Я, конечно, могу повторить два списка, но я не хочу этого делать.
Какой самый питонский способ сделать это?
python
list
elementwise-operations
Sibbs Gambling
источник
источник
Ответы:
Используйте
map
сoperator.add
:или
zip
с пониманием списка:Сроки сравнения:
источник
map
станет более важной. Python 2 потеряет официальную поддержку менее чем за 3 года.Другие привели примеры, как это сделать на чистом питоне. Если вы хотите сделать это с массивами с 100.000 элементов, вы должны использовать numpy:
Делать поэлементное добавление теперь так же тривиально, как
как в Matlab.
Сроки, чтобы сравнить с самой быстрой версией Ashwini:
Так что это в 25 раз быстрее! Но используйте то, что подходит вашей ситуации. Для простой программы вы, вероятно, не хотите устанавливать numpy, поэтому используйте стандартный python (и я считаю версию Henry самой Pythonic). Если у вас серьезные проблемы с числом, позвольте
numpy
сделать тяжелую работу. Для скоростных фанатов: кажется, что решение ошкуриться быстрее, начиная сn = 8
.источник
источник
[sum(x) for x in zip(list1, list2)]
это то же самое, что и ваш ответ, не так ли? :)Как описано другими, в быстром и экономически эффективном решении используется numpy (np) со встроенной возможностью манипулирования вектором:
1. С Numpy
2. Со встроенными модулями
2.1 Лямбда
Обратите внимание, что map () поддерживает несколько аргументов.
2.2 zip и понимание списка
источник
На
numpy
мой взгляд , проще в использовании :Полученные результаты:
Для получения подробной информации о параметрах, проверьте здесь: numpy.add
источник
Возможно, «самый питонический способ» должен включать обработку случая, когда list1 и list2 имеют разный размер. Применение некоторых из этих методов тихо даст вам ответ. Обдуманный подход даст вам знать, скорее всего, с помощью ValueError.
Пример:
Какой результат вы могли бы получить, если бы это было функцией вашей проблемы?
источник
zip_longest
из itertools с помощьюfillvalue
of0
.Это просто с
numpy.add()
Смотрите документ здесь
Если вы хотите получить список питонов:
источник
Это будет работать для 2 или более списков; перебирая список списков, но используя добавление numpy для работы с элементами каждого списка
источник
Возможно, это питон и немного полезен, если у вас есть неизвестное количество списков, и ничего не импортировать.
Пока списки имеют одинаковую длину, вы можете использовать функцию ниже.
Здесь * args принимает переменное число аргументов списка (но только суммирует одинаковое количество элементов в каждом).
* Снова используется в возвращаемом списке для распаковки элементов в каждом из списков.
Вывод:
Или с 3 списками
Вывод:
источник
Используйте карту с лямбда-функцией:
источник
Я не рассчитал это, но подозреваю, что это будет довольно быстро:
источник
Если вам нужно обрабатывать списки разных размеров, не беспокойтесь! Замечательный модуль itertools содержит информацию о вас:
В Python 2
zip_longest
это называетсяizip_longest
.Смотрите также этот соответствующий ответ и комментируйте другой вопрос .
источник
источник
[a + b for (a, b) in zip(list1, list2)]
Хотя реальный вопрос не хочет перебирать список для получения результата, но все предложенные решения делают именно это под капотом!
Чтобы обновить: Вы не можете добавить два вектора, не просматривая все элементы вектора. Итак, алгоритмическая сложность большинства этих решений - Big-O (n). Где n - размерность вектора.
Таким образом, с алгоритмической точки зрения использование цикла for для итеративной генерации результирующего списка также логично и питонно. Однако, кроме того, у этого метода нет накладных расходов на вызов или импорт какой-либо дополнительной библиотеки.
Времена, которые показаны / обсуждаются здесь, зависят от системы и реализации и не могут быть надежной мерой для измерения эффективности операции. В любом случае, большая сложность O операции сложения векторов линейна, что означает O (n).
источник
источник