Ich habe jetzt:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Ich möchte haben:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Einfach eine elementweise Hinzufügung von zwei Listen.
Ich kann die beiden Listen sicherlich wiederholen, aber das möchte ich nicht.
Was ist der pythonischste Weg, dies zu tun?
python
list
elementwise-operations
Sibbs Glücksspiel
quelle
quelle
Antworten:
Verwendung
map
mitoperator.add
:oder
zip
mit einem Listenverständnis:Zeitvergleiche:
quelle
map
Zeit immer wichtiger. Python 2 wird in weniger als 3 Jahren die offizielle Unterstützung verlieren.Die anderen gaben Beispiele, wie dies in reinem Python gemacht wird. Wenn Sie dies mit Arrays mit 100.000 Elementen tun möchten, sollten Sie numpy verwenden:
Das elementweise Hinzufügen ist jetzt so trivial wie
genau wie in Matlab.
Timing zum Vergleich mit Ashwinis schnellster Version:
Das ist also ein Faktor 25 schneller! Aber verwenden Sie, was zu Ihrer Situation passt. Für ein einfaches Programm möchten Sie wahrscheinlich nicht numpy installieren, verwenden Sie also Standard-Python (und ich finde Henrys Version die pythonischste). Wenn Sie ernsthafte Zahlen knirschen, lassen
numpy
Sie das schwere Heben tun. Für die Geschwindigkeitsfreaks: Es scheint, dass die Numpy-Lösung von Anfang an schneller istn = 8
.quelle
quelle
[sum(x) for x in zip(list1, list2)]
ist es dasselbe wie Ihre Antwort, nicht wahr? :)Wie von anderen beschrieben, verwendet eine schnelle und auch platzsparende Lösung numpy (np) mit seiner integrierten Vektormanipulationsfunktion:
1. Mit Numpy
2. Mit Einbauten
2.1 Lambda
Beachten Sie, dass map () mehrere Argumente unterstützt.
2.2 Zip- und Listenverständnis
quelle
numpy
Meiner Meinung nach ist es einfacher zu bedienen :Ergebnisse:
Ausführliche Informationen zu den Parametern finden Sie hier: numpy.add
quelle
Vielleicht sollte "der pythonischste Weg" die Behandlung des Falls beinhalten, in dem Liste1 und Liste2 nicht dieselbe Größe haben. Wenn Sie einige dieser Methoden anwenden, erhalten Sie leise eine Antwort. Der Numpy-Ansatz informiert Sie höchstwahrscheinlich über einen ValueError.
Beispiel:
Welches Ergebnis könnten Sie wünschen, wenn dies in einer Funktion in Ihrem Problem wäre?
quelle
zip_longest
fall sollte man auf jeden fall von itertools mit einemfillvalue
von schauen0
.Das ist einfach mit
numpy.add()
Siehe Dokument hier
Wenn Sie eine Python-Liste erhalten möchten:
quelle
Dies funktioniert für 2 oder mehr Listen. Durchlaufen der Listenliste, aber Verwenden der numpy-Addition, um die Elemente jeder Liste zu behandeln
quelle
Vielleicht ist dies pythonisch und etwas nützlich, wenn Sie eine unbekannte Anzahl von Listen haben und nichts importieren.
Solange die Listen gleich lang sind, können Sie die folgende Funktion verwenden.
Hier akzeptiert * args eine variable Anzahl von Listenargumenten (summiert jedoch jeweils nur die gleiche Anzahl von Elementen).
Das * wird in der zurückgegebenen Liste erneut verwendet, um die Elemente in jeder der Listen zu entpacken.
Ausgabe:
Oder mit 3 Listen
Ausgabe:
quelle
Karte mit Lambda-Funktion verwenden:
quelle
Ich habe es nicht geplant, aber ich vermute, dass dies ziemlich schnell gehen würde:
quelle
Wenn Sie Listen unterschiedlicher Größe bearbeiten müssen, machen Sie sich keine Sorgen! Das wunderbare itertools- Modul hat Sie behandelt:
In Python 2
zip_longest
heißtizip_longest
.Siehe auch diese relevante Antwort und Kommentar zu einer anderen Frage .
quelle
quelle
[a + b for (a, b) in zip(list1, list2)]
Die eigentliche Frage möchte zwar nicht über die Liste iterieren, um das Ergebnis zu generieren, aber alle vorgeschlagenen Lösungen tun genau das unter der Haube!
So aktualisieren Sie: Sie können nicht zwei Vektoren hinzufügen, ohne alle Vektorelemente zu untersuchen. Die algorithmische Komplexität der meisten dieser Lösungen ist also Big-O (n). Wobei n die Dimension des Vektors ist.
Aus algorithmischer Sicht ist die Verwendung einer for-Schleife zum iterativen Generieren der resultierenden Liste logisch und auch pythonisch. Darüber hinaus hat diese Methode jedoch nicht den Aufwand, zusätzliche Bibliotheken aufzurufen oder zu importieren.
Die hier gezeigten / diskutierten Zeitpunkte sind system- und implementierungsabhängig und können keine zuverlässige Maßnahme zur Messung der Effizienz des Vorgangs sein. In jedem Fall ist die große O-Komplexität der Vektoradditionsoperation linear, was O (n) bedeutet.
quelle
quelle