首页 > 解决方案 > 在重复的情况下仅对列表的一个值求和并将其转换为字典

问题描述

堆栈溢出,你好

我有一个问题,我几乎解决了,但是,我不知道最后一步。

因此,在初始列表中有两个几乎相同的元素('Tomato', 3, 'PCS')('Tomato', 2, 'PCS'),其中只有中间参数(数量)不同,最后它应该是这两个数量的总和。最后我应该总结 3 和 2。我将描述它会更容易理解:

因此,初始列表是:

initial = [('Egg', 2, 'PCS'), ('Milk', 100, 'ml'), ('Tomato', 3, 'PCS'), ('Beef', 500, 'g'), ('Sweet pepper', 1, 'PCS'), ('Pita bread', 2, 'PCS'), ('Wine vinegar', 1, 'tbsp'), ('Tomato', 2, 'PCS')]

最后我应该收到:

{'Beef': {'measure': 'g', 'quantity': 500},
 'Egg': {'measure': 'PCS', 'quantity': 2},
 'Milk': {'measure': 'ml', 'quantity': 100},
 'Pita bread': {'measure': 'PCS', 'quantity': 2},
 'Sweet pepper': {'measure': 'PCS', 'quantity': 1},
 'Tomato': {'measure': 'PCS', 'quantity': 5},
 'Wine vinegar': {'measure': 'tbsp', 'quantity': 1}}

但是在我收到的最后一行中'Tomato': {'measure': 'PCS', 'quantity': 2},因为列表中的最后一个元素只是替换了具有相似特征的元素,而不是求和“数量”。

我得到的结果是:

{'Beef': {'measure': 'g', 'quantity': 500},
 'Egg': {'measure': 'PCS', 'quantity': 2},
 'Milk': {'measure': 'ml', 'quantity': 100},
 'Pita bread': {'measure': 'PCS', 'quantity': 2},
 'Sweet pepper': {'measure': 'PCS', 'quantity': 1},
 'Tomato': {'measure': 'PCS', 'quantity': 2},
 'Wine vinegar': {'measure': 'tbsp', 'quantity': 1}}

我的代码是:

for elems2 in initial:
    dinit = {'measure': elems2[2], 'quantity': elems2[1]}
    d = {}.fromkeys([elems2[0]], dinit)
    new_book[elems2[0]] = dinit
pprint(new_book)

有人可以帮我解决对“数量”求和的问题 - 列表元素内的元素吗?

标签: pythonpython-3.xlistdictionary

解决方案


您可以使用一个简单的 for 循环:

result = {}
for item in initial:
    key, quantity, measure = item
    if key in result:
        result[key]["quantity"] += quantity
    else:
        result[key] = {"measure": measure, "quantity": quantity}

print(result)

这产生

{'Egg': {'measure': 'PCS', 'quantity': 2}, 
 'Milk': {'measure': 'ml', 'quantity': 100}, 
 'Tomato': {'measure': 'PCS', 'quantity': 5}, 
 'Beef': {'measure': 'g', 'quantity': 500}, 
 'Sweet pepper': {'measure': 'PCS', 'quantity': 1}, 
 'Pita bread': {'measure': 'PCS', 'quantity': 2}, 
 'Wine vinegar': {'measure': 'tbsp', 'quantity': 1}}

推荐阅读