Обработка списка словарей

Всех приветствую, есть такой код:

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']]
→ Ссылка