J'ai maintenant:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Je souhaite avoir:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Un simple ajout élémentaire de deux listes.
Je peux sûrement parcourir les deux listes, mais je ne veux pas le faire.
Quelle est la façon la plus Pythonique de le faire?
python
list
elementwise-operations
Sibbs Gambling
la source
la source
Réponses:
Utiliser
map
avecoperator.add
:ou
zip
avec une liste de compréhension:Comparaisons de synchronisation:
la source
map
deviendra de plus en plus important au fil du temps. Python 2 perdra son support officiel en moins de 3 ans.Les autres ont donné des exemples sur la façon de le faire en python pur. Si vous voulez le faire avec des tableaux avec 100 000 éléments, vous devez utiliser numpy:
Faire l'ajout élément par élément est maintenant aussi trivial que
comme dans Matlab.
Moment de comparaison avec la version la plus rapide d'Ashwini:
C'est donc un facteur 25 plus rapide! Mais utilisez ce qui convient à votre situation. Pour un programme simple, vous ne voulez probablement pas installer numpy, utilisez donc le python standard (et je trouve la version d'Henry la plus Pythonique). Si vous aimez sérieusement le nombre, laissez
numpy
le gros du travail. Pour les monstres de vitesse: il semble que la solution numpy soit plus rapide au départn = 8
.la source
la source
[sum(x) for x in zip(list1, list2)]
la même chose que votre réponse, n'est-ce pas? :)Comme décrit par d'autres, une solution rapide et efficace en termes d'espace utilise numpy (np) avec sa capacité de manipulation vectorielle intégrée:
1. Avec Numpy
2. Avec intégré
2.1 Lambda
Notez que map () prend en charge plusieurs arguments.
2.2 Compréhension zip et liste
la source
C'est plus simple à utiliser
numpy
selon moi:Résultats:
Pour des informations détaillées sur les paramètres, consultez ici: numpy.add
la source
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 une ValueError.
Exemple:
Quel résultat souhaiteriez-vous s'il s'agissait d'une fonction de votre problème?
la source
zip_longest
depuis itertools avec unfillvalue
de0
.C'est simple avec
numpy.add()
Voir le doc ici
Si vous souhaitez recevoir une liste python:
la source
Cela fonctionnera pour 2 listes ou plus; itération à travers la liste des listes, mais en utilisant l'addition numpy pour traiter les éléments de chaque liste
la source
C'est peut-être pythonique et légèrement utile si vous avez un nombre inconnu de listes, et sans rien importer.
Tant que les listes sont de la même longueur, vous pouvez utiliser la fonction ci-dessous.
Ici, le * args accepte un nombre variable d'arguments de liste (mais additionne seulement le même nombre d'éléments dans chacun).
Le * est à nouveau utilisé dans la liste renvoyée pour décompresser les éléments dans chacune des listes.
Production:
Ou avec 3 listes
Production:
la source
Utilisez la carte avec la fonction lambda:
la source
Je ne l'ai pas chronométré mais je pense que ce serait assez rapide:
la source
Si vous devez gérer des listes de tailles différentes, ne vous inquiétez pas! Le merveilleux module itertools vous a couvert:
En Python 2,
zip_longest
est appeléizip_longest
.Voir également cette réponse pertinente et commentez une autre question .
la source
la source
[a + b for (a, b) in zip(list1, list2)]
Bien que la vraie question ne veuille pas parcourir la liste pour générer le résultat, mais toutes les solutions qui ont été proposées font exactement cela sous le capot!
Pour rafraîchir: Vous ne pouvez pas ajouter deux vecteurs sans regarder tous les éléments vectoriels. Ainsi, la complexité algorithmique de la plupart de ces solutions est Big-O (n). Où n est la dimension du vecteur.
Donc, d'un point de vue algorithmique, l'utilisation d'une boucle for pour générer de manière itérative la liste résultante est également logique et pythonique. Cependant, en outre, cette méthode n'a pas la charge d'appeler ou d'importer une bibliothèque supplémentaire.
Les horaires qui sont montrés / discutés ici dépendent du système et de la mise en œuvre, et ne peuvent pas être une mesure fiable pour mesurer l'efficacité de l'opération. Dans tous les cas, la grande complexité O de l'opération d'addition vectorielle est linéaire, c'est-à-dire O (n).
la source
la source