webentwicklung-frage-antwort-db.com.de

Summe der Listenlisten; gibt die Summenliste zurück

Lassen Sie data = [[3,7,2],[1,4,5],[9,8,7]]

Angenommen, ich möchte die Elemente für die Indizes jeder Liste in der Liste zusammenfassen, z. B. das Hinzufügen von Zahlen in einer Matrixspalte, um eine einzelne Liste zu erhalten. Ich gehe davon aus, dass alle Listen in Daten gleich lang sind.

    print foo(data)

   [[3,7,2],
    [1,4,5],
    [9,8,7]]
    _______
 >>>[13,19,14]

Wie kann ich die Liste der Listen durchlaufen, ohne dass ein Index außerhalb des Bereichsfehlers erscheint? Vielleicht Lambda? Vielen Dank!

21
Albert

Sie könnten dies versuchen:

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

In [10]: [sum(i) for i in Zip(*l)]
Out[10]: [13, 19, 14]

Dabei wird die Liste mit einer Kombination aus Zip und * entpackt und anschließend die Elemente nach ihrem Index verschlüsselt. Sie verwenden dann ein Listenverständnis, um die Gruppen ähnlicher Indizes zu durchlaufen, sie zu summieren und an ihrer 'ursprünglichen' Position zurückzukehren.

Um es hoffentlich etwas klarer zu machen, passiert Folgendes, wenn Sie durch Zip(*l) iterieren:

In [13]: for i in Zip(*l):
   ....:     print i
   ....:     
   ....:     
(3, 1, 9)
(7, 4, 8)
(2, 5, 7)

Bei Listen mit ungleicher Länge können Sie itertools.izip_longest mit einer fillvalue von 0 verwenden. Dadurch werden fehlende Indizes im Wesentlichen mit 0 gefüllt, sodass Sie alle 'Spalten' summieren können:

In [1]: import itertools

In [2]: l = [[3,7,2],[1,4],[9,8,7,10]]

In [3]: [sum(i) for i in itertools.izip_longest(*l, fillvalue=0)]
Out[3]: [13, 19, 9, 10]

In diesem Fall würde das Durchlaufen von izip_longest folgendermaßen aussehen:

In [4]: for i in itertools.izip_longest(*l, fillvalue=0):
   ...:     print i
   ...:     
(3, 1, 9)
(7, 4, 8)
(2, 0, 7)
(0, 0, 10)
59
RocketDonkey

Für alle Matrixoperationen (oder andere ehrgeizige numerische Operationen) würde ich empfehlen, sich NumPy anzuschauen. 

Das Beispiel für das Lösen der Summe eines Arrays entlang der in Ihrer Frage angezeigten Achse wäre:

>>> from numpy import array
>>> data = array([[3,7,2],
...     [1,4,5],
...     [9,8,7]])
>>> from numpy import sum
>>> sum(data, 0)
array([13, 19, 14])

Hier ist die Dokumentation von numpy für ihre Summenfunktion: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

Das zweite Argument ist besonders interessant, da es einfach anzugeben ist, was zusammengefasst werden soll: alle Elemente oder nur eine bestimmte Achse eines potenziell n-dimensionalen Arrays (like).

10
Theuni

Dadurch erhalten Sie die Summe für jede Unterliste

data = [[3,7,2],[1,4],[9,8,7,10]]
list(map(sum, data))
[12, 5, 34]

Wenn Sie alle Elemente summieren möchten und nur eine Summe erhalten, verwenden Sie diese Option

data = [[3,7,2],[1,4],[9,8,7,10]]
sum(sum(data, []))
51
8
MySchizoBuddy
>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> for column in enumerate(data[0]):
...     count = sum([x[column[0]] for x in data])
...     print 'Column %s: %d' % (column[0], count)
... 
Column 0: 3
Column 1: 6
Column 2: 9
2
Natan

Dies hängt von Ihrer Annahme ab, dass alle inneren Listen (oder Zeilen) die gleiche Länge haben, es sollte jedoch tun, was Sie wollen:

sum_list = []

ncols = len(data[0])

for col in range(ncols):
    sum_list.append(sum(row[col] for row in data))


sum_list
Out[9]: [13, 19, 14]
0
Marius
def sum(L):
res = list()
for j in range(0,len(L[0])):
    tmp = 0
    for i in range(0,len(L)):
        tmp = tmp + L[i][j]
    res.append(tmp)
return res
0
user3481919
numArr = [[12, 4], [1], [2, 3]]

sumArr = 0

sumArr = sum(sum(row) for row in numArr)

print(sumArr) 

the answere: 22

was ich getan habe: Wenn Sie "für" wie folgt vorgehen: [row.append (1) für row in numArr] ändert sich die Liste in: [[12, 4, 1], [1, 1], [2 , 3, 1]] Ich habe die Funktion sum () von Python verwendet, die Funktion nimmt die Liste und iteriert darauf und bringt die Summe aller Zahlen in der Liste. als ich sum (sum ()) gemacht habe, habe ich die Summe aller Listen in der großen Liste erhalten.

0