Обработка списка словарей
Всех приветствую, есть такой код:
fish_taked = ""
for item in p.fish_data['fish']:
for k, v in item.items():
fish_taked += f"? » {k} ⚗{v[0]} ⚖{v[1]} кг.\n"
return await ctx.reply(f"? » Активная наживка: {p.fish_data['active_bait'] or 'нет'}\n"
f"? » 1. Хлеб: {p.fish_data['baits'][0]}\n"
f"? » 2. Червяк: {p.fish_data['baits'][1]}\n"
f"? » 3. Насекомое: {p.fish_data['baits'][2]}\n"
"? » Пойманная рыба:\n" + fish_taked)
Пример хранения данных в p.fish_data['fish']
"fish": [
{
"Асётр": [(2, 0.36), (1, 0.32)]
},
{
"Форель": [(2, 0.255), (1, 0.542)]
}]
Но на данный момент, я вывожу кадую рыбу по отдельности, что занимает очень много текста, как пример ниже:
Как можно подсчитать чтобы на выводе получалось: Форель - 2 шт (0.797 кг), Асётр - 2 шт (0.68 кг) То есть - подсчитать кол-во рыб с одинаковым названием и их общим весом.
Ответы (1 шт):
Автор решения: entithat
→ Ссылка
Переписал в более доступном формате:
from functools import reduce
d = { "fish": [{ "Асётр": [(2, 0.36), (1, 0.32)]}, { "Форель": [(2, 0.255), (1, 0.542)]} ]}
for i, e in enumerate(d['fish']):
key = [*e.keys()][0]
value = [*e.values()][0]
d['fish'][i] = { key: [len(value), reduce(lambda acc, v: acc + v[1], value, 0)] }
print(d)
Либо однострочное решение (выглядит ужасно):
d['fish'] = [{ [*e.keys()][0]: [len([*e.values()][0]), reduce(lambda acc, v: acc + v[1], [*e.values()][0], 0)] } for e in d['fish']]
