Ahora tengo:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Deseo tener:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Simplemente una adición por elementos de dos listas.
Seguramente puedo repetir las dos listas, pero no quiero hacer eso.
¿Cuál es la forma más pitónica de hacerlo?
python
list
elementwise-operations
Sibbs Gambling
fuente
fuente
Respuestas:
Usar
map
conoperator.add
:o
zip
con una lista de comprensión:Comparaciones de tiempo:
fuente
map
solo se volverá más importante con el tiempo. Python 2 perderá el soporte oficial en menos de 3 años.Los otros dieron ejemplos de cómo hacer esto en Python puro. Si desea hacer esto con matrices con 100.000 elementos, debe usar numpy:
Hacer la suma por elementos es ahora tan trivial como
como en Matlab
Momento para comparar con la versión más rápida de Ashwini:
¡Entonces este es un factor 25 más rápido! Pero usa lo que se adapte a tu situación. Para un programa simple, probablemente no quieras instalar numpy, así que usa Python estándar (y creo que la versión de Henry es la más Pythonic). Si te gustan los números serios, deja
numpy
el trabajo pesado. Para los fanáticos de la velocidad: parece que la solución numpy es más rápida al comenzarn = 8
.fuente
fuente
[sum(x) for x in zip(list1, list2)]
es lo mismo que tu respuesta, ¿no? :)Según lo descrito por otros, una solución rápida y eficiente en el espacio está usando numpy (np) con su capacidad incorporada de manipulación de vectores:
1. Con Numpy
2. Con incorporados
2.1 Lambda
Tenga en cuenta que map () admite múltiples argumentos.
2.2 comprensión de zip y lista
fuente
Es más simple de usar
numpy
desde mi opinión:Resultados:
Para obtener información detallada sobre los parámetros, consulte aquí: numpy.add
fuente
Quizás "la forma más pitónica" debería incluir el manejo del caso donde list1 y list2 no son del mismo tamaño. La aplicación de algunos de estos métodos le dará una respuesta en silencio. El enfoque numpy te lo hará saber, muy probablemente con un ValueError.
Ejemplo:
¿Qué resultado podría desear si esto estuviera en una función de su problema?
fuente
zip_longest
desde itertools con unfillvalue
de0
.Esto es simple con
numpy.add()
Ver documento aquí
Si desea recibir una lista de Python:
fuente
Esto funcionará para 2 o más listas; iterando a través de la lista de listas, pero usando la suma numpy para tratar con elementos de cada lista
fuente
Quizás esto sea pitónico y ligeramente útil si tiene un número desconocido de listas y sin importar nada.
Mientras las listas sean de la misma longitud, puede usar la siguiente función.
Aquí el * args acepta un número variable de argumentos de lista (pero solo suma el mismo número de elementos en cada uno).
El * se usa nuevamente en la lista devuelta para descomprimir los elementos en cada una de las listas.
Salida:
O con 3 listas
Salida:
fuente
Use el mapa con la función lambda:
fuente
No lo he cronometrado, pero sospecho que esto sería bastante rápido:
fuente
Si necesita manejar listas de diferentes tamaños, ¡no se preocupe! El maravilloso módulo itertools lo tiene cubierto:
En Python 2,
zip_longest
se llamaizip_longest
.Vea también esta respuesta relevante y comente sobre otra pregunta .
fuente
fuente
[a + b for (a, b) in zip(list1, list2)]
Aunque, la pregunta real no quiere iterar sobre la lista para generar el resultado, ¡pero todas las soluciones que se han propuesto hacen exactamente eso debajo del capó!
Para actualizar: No puede agregar dos vectores sin examinar todos los elementos del vector. Entonces, la complejidad algorítmica de la mayoría de estas soluciones son Big-O (n). Donde n es la dimensión del vector.
Entonces, desde un punto de vista algorítmico, usar un bucle for para generar iterativamente la lista resultante también es lógico y pitónico. Sin embargo, además, este método no tiene la sobrecarga de llamar o importar ninguna biblioteca adicional.
Los tiempos que se muestran / discuten aquí dependen del sistema y la implementación, y no pueden ser medidas confiables para medir la eficiencia de la operación. En cualquier caso, la gran complejidad de O de la operación de suma de vectores es lineal, lo que significa O (n).
fuente
fuente