J'ai essayé de lire de nombreuses questions similaires (cela semblait le plus proche: Python sum dict dict values based on) mais a encore du mal à répondre à la question suivante ci-dessous. Réduire à l'essentiel

J'ai les 3 dictionnaires suivants avec des listes comme clés:

{'milk': ['gallons', 5, 10, 50]}
{'eggs': ['cartons', 5, 2, 10]}
{'bacon': ['packages', 5, 7, 35]}

Je veux pouvoir additionner la dernière valeur de chaque liste imbriquée et avoir une valeur unique attendue de 95 imprimée à l'écran.

J'ai vu des réponses à des questions similaires qui impliquent des lambdas, mais je sais qu'il doit y avoir un moyen de le faire en parcourant la liste. J'ai vu l'utilisation de sum et Counter et je suis ouvert à toute explication. Merci d'avance.

MISE À JOUR / CONTEXTE AJOUTÉ

Merci à ceux qui ont déjà répondu. Je me rends compte que plus de contexte peut être nécessaire pour répondre à cette question.

Ces entrées sont faites à partir de cette classe:

class GroceryCart(dict):

    def __init__(self):
        self = {}

    def addToCart(self, item, units, quantity, price):
        item_total = quantity*price
        self.update({item:[units, quantity, price, item_total]})

    def returnCart(self):
        return self

my_cart = GroceryCart()

C'est là que vous obtenez la structure funky des informations. J'ai essayé la réponse de @ ggorlan ci-dessous, mais j'ai eu des erreurs de trace sur le fait de ne pas avoir de valeurs str à utiliser .values()

Traceback (most recent call last):
  File "grocery_store.py", line 156, in <module>
    total = sum(sum(y[-1] for y in x.values()) for x in my_cart)
  File "grocery_store.py", line 156, in <genexpr>
    total = sum(sum(y[-1] for y in x.values()) for x in my_cart)
AttributeError: 'str' object has no attribute 'values'
0
PolishZeus 16 avril 2018 à 07:29

4 réponses

Meilleure réponse

Essaye ça:

foods = {
    'milk': ['gallons', 5, 10, 50],
    'eggs': ['cartons', 5, 2, 10],
    'bacon': ['packages', 5, 7, 35]
}

s = sum([item[-1] for item in foods.values()])

Le s sera 95.

0
Mehrdad Pedramfar 16 avril 2018 à 10:41

En supposant que vous souhaitiez que vos dictionnaires figurent dans une liste, utilisez le code suivant. Deux for boucles sont nécessaires: la première itère jusqu'à foods qui est une liste de dictionnaires et la seconde itère les valeurs du dictionnaire en cours d'itération. food.values() renvoie les listes de votre dictionnaire et lst[-1] sélectionne le dernier élément de la liste en cours d'itération.

foods = [
    {'milk': ['gallons', 5, 10, 50]},
    {'eggs': ['cartons', 5, 2, 10]},
    {'bacon': ['packages', 5, 7, 35]}
]

sum = 0
for food in foods:
    for details in food.values():
        sum += details[-1]
print(sum)  # 95

Sinon, en supposant que vous les vouliez comme un seul dictionnaire, utilisez le code suivant. Cette fois, une seule boucle for est nécessaire pour parcourir toutes les valeurs du dictionnaire.

foods = {
    'milk': ['gallons', 5, 10, 50],
    'eggs': ['cartons', 5, 2, 10],
    'bacon': ['packages', 5, 7, 35]
}

sum = 0
for lst in foods.values():
    sum += lst[-1]
print(sum)  # 95
1
chambln 16 avril 2018 à 05:01

Je suppose, compte tenu de la nature de votre question, que c'est probablement pour un travail en classe, auquel cas j'envisagerais sérieusement de demander à votre professeur / professeur s'il veut des dictionnaires à clé unique, car il semble beaucoup plus probable qu'ils le voudraient plutôt que la structure de données que vous avez conçue. Cela étant dit, @contrum a une belle solution pour le résoudre en tant que dictionnaire multi-clé; Sinon, puisque vous avez déclaré que vous souhaitez itérer les dictionnaires et qu'il est assez facile d'ajouter des listes, les éléments suivants devraient fonctionner correctement pour vous tout en ayant un nom ponctuel:

def getSum(dictList):
    result = 0
    dictList = [{'milk': ['gallons', 5, 10, 50]}, {'eggs': ['cartons', 5, 2, 10]}, {'bacon': ['packages', 5, 7, 35]}]
    for richard in dictList:
        for key in richard:
            result += richard[key][len(richard[key]) - 1]
    return result
0
democidist 16 avril 2018 à 05:12

C'est une structure étrange. Il semble que vos valeurs soient des listes, pas les clés. Si je suppose que les trois objets sont dans un tableau, voici une tentative:

food = [
    {'milk': ['gallons', 5, 10, 50]},
    {'eggs': ['cartons', 5, 2, 10]},
    {'bacon': ['packages', 5, 7, 35]}
]

total = sum(list(x.values())[0][-1] for x in food)
print(total) # 95
2
ggorlen 16 avril 2018 à 16:27