4 votes

Somme d'une liste imbriquée sans utiliser la fonction SUM (exercice)

J'essaie d'écrire une fonction qui prend la somme de chaque liste et renvoie les valeurs individuelles dans une nouvelle liste unique. Par exemple

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

devient

[15, 15, 15]

Ce que j'ai jusqu'à présent :

def row_sums(square):
    total_list = []
    total = 0
    for i in square:
        for j in i: 
            total += j
        total_list.append(total)
    return total_list    

Mais cela ne fait qu'accumuler les listes les unes sur les autres, ce qui donne.. :

[15, 30, 45] 

Je ne sais pas comment séparer les sommes de chaque liste ici. La fonction SUM n'est pas autorisée ici car il s'agit d'un exercice sur les boucles imbriquées.

Merci.

3voto

levi Points 14004

Vous devez réinitialiser votre total compteur avant de commencer chaque intérieur pour. De plus, vous n'avez pas besoin de le déclarer à l'extérieur, car vous ne l'utiliserez qu'à l'intérieur.

def row_sums(square):
    total_list = []
    for i in square:
        total = 0
        for j in i: 
            total += j
        total_list.append(total)
    return total_list

3voto

Vaibhav Bajaj Points 1591

L'erreur vient du fait que vous ne réinitialisez pas la total après chaque boucle. Au lieu de cela, initialiser sum = 0 dans le premier for-loop comme ceci :

def row_sums(square):
    total_list = []
    for i in square:
        total = 0
        for j in i: 
            total += j
        total_list.append(total)
    return total_list

2voto

sun qingyao Points 1584

Juste pour le plaisir :

>>> list = [[2, 7, 6], [9, 5, 1], [4, 3, 8]] 
>>> import functools
>>> [functools.reduce(lambda x, y: x + y, sublist, 0) for sublist in list]
[15, 15, 15]

Je n'ai pas utilisé sum :)

Vous pouvez en savoir plus sur functools.reduce aquí .

Edit : Comme Sevanteri l'a souligné dans le commentaire, vous pouvez également utiliser [functools.reduce(int.__add__, sublist, 0) for sublist in list] (si vous voulez vraiment rendre votre professeur fou !)

1voto

PairProgramming Points 51

Vous devez mettre à zéro votre total pour chaque liste.

def row_sums(square):
    total_list = []
    total = 0
    for i in square:
       for j in i: 
          total += j
       total_list.append(total)
       total = 0
    return total_list

0voto

Pour être différent, aplatissez les listes et utilisez un générateur (en supposant que les sous-listes ont la même longueur) :

def _notsum2(lists):
    per_yield = len(lists)
    total = 0
    for ind, next in enumerate(val for sublist in lists for val in sublist):
        if ind % per_yield == 0 and ind:
            yield total
            total = 0
        total += next
    yield total

if __name__ == '__main__':
    li = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
    print [g for g in _notsum2(li)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X