Python - 嵌套在dict中的列表 - 如何对单个值求和

时间:2018-04-16 04:29:27

标签: python list dictionary sum

我尝试阅读许多类似的问题(这似乎最接近:Python sum dict values based on keys),但仍在努力回答下面的问题。将其归结为基础

我有以下3个词典,列表为键:

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

我希望能够将每个嵌套列表的最后一个值相加,并在屏幕上打印出预期的单值 95

我已经看到了涉及lambdas的类似问题的答案,但我知道必须有一种方法来迭代列表。我已经看到使用总和计数器,并且对任何解释持开放态度。 提前谢谢。

更新/添加上下文

感谢那些已经回复的人。我意识到可能需要更多的背景来回答这个问题。

这些条目来自这个类:

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

这就是你获得信息的时髦结构的地方。 我在下面尝试了@ ggorlan的回复,但是在没有使用str值的情况下得到了追溯错误.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'

4 个答案:

答案 0 :(得分:2)

这是一个奇怪的结构。看起来您的值是列表,而不是键。如果我假设这三个对象在一个数组中,这是一个尝试:

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

答案 1 :(得分:1)

假设您希望列表中包含词典,请使用以下代码。需要两个for循环:第一个循环遍历foods,这是一个字典列表,第二个循环遍历当前正在迭代的字典中的值。 food.values()生成字典中的列表,lst[-1]选择当前正在迭代的列表中的最后一个元素。

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

否则假设您希望将它们作为一个字典,请使用以下代码。这次只需要一个for循环来遍历字典的每个值。

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

答案 2 :(得分:0)

我认为,鉴于你的问题的性质,它可能是一个课堂作业,在这种情况下,我会认真考虑问你的老师/教授他们是否想要单键词典,因为它似乎更多可能他们想要的而不是你设计的数据结构。话虽这么说,@ contrum有一个可爱的解决方案,可以解决它作为一个多键词典;否则,既然您已经声明要迭代字典并且很容易追加列表,那么以下内容应该对您有用,同时还有一个非常简单的名称:

from tensorflow.contrib import keras

答案 3 :(得分:0)

试试这个:

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

s将是95。