Python, сортировка словаря orderDicts по значению их суммы - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующий словарь:

pprint(cls.bags)

{'ground system bag': {'Ground System Bag': 8.0, 'Tablet': 9.65},
 'planes bag': {'Baznat': 0.72,
                'Bungee': 1.26,
                'Full Bandolera ': 3.76,
                'hammer': 1.28,
                'planes bag': 8.5},
 'pods bag': {'Pod': 1.74, 'optic': 0.86, 'pods bag': 8.72, 'thermal': 1.2}}

Я хочу отсортировать вложенные словари по сумме их значений.

означает, что результат должен быть:

for item in cls.bags.values():
    pprint(sum(item.values()))

вывод:

15.52
12.52
17.65

когда сортировка продиктована, она должна быть:

17.65
15.52
12.52

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете использовать collections.OrderedDict:

from collections import OrderedDict

x = {
    'ground system bag': {
        'Ground System Bag': 8.0, 
        'Tablet': 9.65
    },
    'planes bag': {
        'Baznat': 0.72,
        'Bungee': 1.26,
        'Full Bandolera ': 3.76,
        'hammer': 1.28,
        'planes bag': 8.5
    },
    'pods bag': {
        'Pod': 1.74, 
        'optic': 0.86, 
        'pods bag': 8.72, 
        'thermal': 1.2
    }
}

ordered = OrderedDict(
    sorted(
        [[k,v] for (k,v) in x.items()], 
        key=lambda kv: sum(kv[1].values()), 
        reverse=True
    )
)

for item in ordered.values():
    print(sum(item.values()))

Это напечатает желаемый вывод.

0 голосов
/ 01 мая 2020

Словарь по своей природе неупорядочен. Таким образом, вам нужно будет создать порядок итераций вручную:

for _, dct in sorted(cls.bags.items()):
    pprint(sum(dct.values()))

Или отсортировать по сумме:

for s in sorted((sum(dct.values()) for dct in cls.bags.values()), reverse=True):
    pprint(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...