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