35 Stimmen

Zusammenführen/Hinzufügen von Listen in Python

Ich bin mir ziemlich sicher, dass es einen pythonischeren Weg geben sollte, dies zu tun - aber mir fällt keiner ein: Wie kann ich eine zweidimensionale Liste in eine eindimensionale Liste zusammenführen? So ähnlich wie zip/map, aber mit mehr als zwei Iteratoren.

Beispiel: Ich habe die folgende Liste:

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Ich möchte

result = [12, 15, 18] # [1+4+7, 2+5+8, 3+6+9]

Bis jetzt habe ich Folgendes herausgefunden:

def add_list(array):
    number_items = len(array[0])
    result = [0] * number_items
    for index in range(number_items):
        for line in array:
            result[index] += line[index]
    return result

Aber das sieht für mich nicht sehr elegant/pythonisch aus. Abgesehen davon, dass nicht geprüft wird, ob alle "Linien" im 2D-Array gleich lang sind, aneinandergefügt werden können usw. Was wäre ein besserer Weg, dies zu tun?

71voto

Ned Batchelder Punkte 342778
[sum(a) for a in zip(*array)]

63voto

Charles Merriam Punkte 18484

[sum(value) for value in zip(*array)] ist ein ziemlicher Standard.

Das könnte Ihnen helfen, es zu verstehen:

In [1]: array=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [2]: array
Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [3]: *array
------------------------------------------------------------
   File "<ipython console>", line 1
     *array
     ^
<type 'exceptions.SyntaxError'>: invalid syntax

Der unäre Stern ist kein eigenständiger Operator. Er wandelt Array-Elemente in Argumente für Funktionsaufrufe um.

In [4]: zip(*array)
Out[4]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

zip() ist eine eingebaute Funktion

In [5]: zip(*array)[0]
Out[5]: (1, 4, 7)

jedes Element der von zip zurückgegebenen Liste ist eine Menge von Zahlen, die Sie wünschen.

In [6]: sum(zip(*array)[0])
Out[6]: 12

In [7]: [sum(values) for values in zip(*array)]
Out[7]: [12, 15, 18]

14voto

ngn Punkte 7412

Ein alternativer Weg:

map(sum, zip(*array))

8voto

Alex Coventry Punkte 64405

Wenn Sie viel mit dieser Art von Dingen zu tun haben, sollten Sie sich über Folgendes informieren scipy .

>>> import scipy
>>> sum(scipy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
array([12, 15, 18])

Alle Arraygrößen werden automatisch für Sie überprüft. Die Summe wird in reinem C erstellt, daher ist sie sehr schnell. scipy Arrays sind auch sehr speichereffizient.

Der Nachteil ist, dass Sie von einem ziemlich komplexen Modul eines Drittanbieters abhängig sind. Aber das ist für viele Zwecke ein sehr guter Kompromiss.

3voto

heltonbiker Punkte 24989

Zustimmen mit fivebells, aber Sie könnten auch Numpy, die eine kleinere (schnellere Import) und mehr generische Implementierung von Array-ähnlichen Sachen ist. (Eigentlich ist es eine Abhängigkeit von scipy). Dies sind großartige Werkzeuge, die, wie bereits gesagt wurde, ein "Muss" sind, wenn Sie mit dieser Art von Manipulationen zu tun haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X