Суммирование только одного значения списка в случае повторения и преобразования его в словарь - PullRequest
2 голосов
/ 08 апреля 2020

Stackoverflow, привет

У меня есть проблема, которую я почти решил, однако я не знаю, как сделать последний шаг.

Итак, в начальном списке есть два почти идентичных элементы ('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)

Может ли кто-нибудь помочь мне решить проблему суммирования «количества» - элемента внутри элемента список

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вы можете использовать простой для l oop:

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}}
0 голосов
/ 08 апреля 2020

Вы можете сделать:

from collections import defaultdict
import pprint

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

# count the measures by ingredient
counts = defaultdict(int)
for ingredient, quantity, measure in initial:
    counts[(ingredient, measure)] += quantity

result = {ingredient: {'measure': measure, 'quantity': quantity} for (ingredient, measure), quantity in counts.items()}

pprint.pprint(result)

Выход

{'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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...