329 votes

Elément par rapport à l'ajout de 2 listes en Python?

J'ai maintenant:

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

Je souhaite avoir:

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

Simplement un ajout élémentaire de deux listes.

Je peux sûrement parcourir les deux listes, mais je ne veux pas le faire.

Quel est le moyen le plus pythonique de le faire?

464voto

Ashwini Chaudhary Points 94431

Utilisez map avec operator.add :

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

ou zip avec une compréhension de liste:

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

Comparaisons de temps:

 >>> 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
 

130voto

Bas Swinckels Points 7613

Les autres ont donné des exemples de la façon de le faire dans le plus pur python. Si vous voulez le faire avec les tableaux avec 100.000 éléments, vous devez utiliser numpy:

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

Faire l'élément plus sage est maintenant aussi trivial que

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

tout comme dans Matlab.

Calendrier pour comparer avec Ashwini la version la plus rapide:

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

C'est donc un facteur de 25 plus vite! Mais l'utilisation de ce qui convient à votre situation. Pour un programme simple, vous ne voulez probablement pas à installer numpy, de sorte que l'utilisation standard de python (et je trouve Henry de la version la plus pythonic). Si vous êtes sérieusement en de nombreux calculs, laissez - numpy faire le gros du travail. Pour la vitesse de freaks: il semble que la numpy solution est plus rapide à partir d'environ n = 8.

76voto

Henry Gomersall Points 2916
[a + b for a, b in zip(list1, list2)]

8voto

Fred Mitchell Points 1068

Peut-être que "la manière la plus pythonique" devrait inclure la gestion du cas où list1 et list2 ne sont pas de la même taille. L'application de certaines de ces méthodes vous donnera tranquillement une réponse. L’approche numpy vous le fera savoir, très probablement avec ValueError.

Exemple:

 import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)
 

Quel résultat voudriez-vous si cela faisait partie de votre problème?

4voto

Peaters Points 1

Utilisez la carte avec la fonction lambda:

 >>> map(lambda x, y: x + y, list1, list2)
[5, 7, 9]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X