web-dev-qa-db-fra.com

Somme de liste de listes; retourne la liste des sommes

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

Supposons que je veuille additionner les éléments des index de chaque liste de la liste, par exemple en ajoutant des nombres dans une colonne de la matrice pour obtenir une liste unique. Je suppose que toutes les listes de données ont la même longueur.

    print foo(data)

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

Comment puis-je parcourir la liste des listes sans obtenir une erreur d'index hors de portée? Peut-être lambda? Merci!

21
Albert

Vous pouvez essayer ceci:

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]

Ceci utilise une combinaison de Zip et * pour décompresser la liste, puis compresser les éléments en fonction de leur index. Vous utilisez ensuite une liste de compréhension pour parcourir les groupes d'indices similaires, en les additionnant et en revenant à leur position «originale».

Pour que les choses soient un peu plus claires, voici ce qui se passe lorsque vous parcourez la fonction Zip(*l):

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

Dans le cas de listes de longueur inégale, vous pouvez utiliser itertools.izip_longest avec un fillvalue de 0 - ceci remplit les index manquants avec 0, ce qui vous permet de totaliser toutes les colonnes:

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]

Dans ce cas, voici à quoi ressemblerait l'itération sur izip_longest:

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

Pour toutes les opérations matricielles (ou autres opérations numériques ambitieuses), je vous conseillerais de vous pencher sur NumPy. 

L'échantillon pour résoudre la somme d'un tableau le long de l'axe indiqué dans votre question serait:

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

Voici la documentation de numpy pour sa fonction sum: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

En particulier, le deuxième argument est intéressant car il permet de spécifier facilement ce qui doit être résumé: tous les éléments ou seulement un axe spécifique d’un tableau potentiellement à n dimensions (comme).

10
Theuni

Cela vous donnera la somme pour chaque sous-liste

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

Si vous voulez additionner tous les éléments et n’obtenir qu’une somme, utilisez cette 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

Cela dépend de votre hypothèse selon laquelle toutes les listes internes (ou rangées) ont la même longueur, mais cela doit faire ce que vous voulez:

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