Сортировка вложенного словаря по значениям во вложенном словаре, а затем по длине подсловаря - PullRequest
0 голосов
/ 09 февраля 2020

Как новичок ie Я борюсь с сортировкой вложенного словаря. Допустим, у меня есть два вложенных словаря в качестве примеров:

Пример 1:

{'Red': {'Pesho': 2000}, 'Blue': {'Tosho': 1000}, 'Green': {'Gosho': 1000}, 'Yellow': {'Sasho': 4500}, 'Stamat': {'Prakasho': 1000}}

Пример 2:

{'Red': {'Pesho': 10000}, 'Blue': {'Pesho': 10000, 'Gosho': 10000}}

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

Например, 1:
(желтый) Sasho <-> 4500
(красный) Pesho <-> 2000
(синий) Tosho <-> 1000
(зеленый) Gosho <-> 1000
(Stamat) Prakasho <-> 1000

Например, 2:
(синий) Pesho <-> 10000
(синий) Gosho <-> 10000
(красный) Pesho <-> 10000

Я думаю, что это можно сделать с помощью sorted (), используя лямбды, но я не могу исказить точный синтаксис. Буду очень признателен за любые советы.

1 Ответ

2 голосов
/ 09 февраля 2020

Я бы сначала прошел через промежуточное представление, чтобы связать размер группы, которой принадлежит элемент, чтобы использовать его в сортировке.

>>> l2 = [(k,el,d[k][el],len(v)) for k,v in d.items() for el in v]
>>> l2
[('Red', 'Pesho', 10000, 1), ('Blue', 'Pesho', 10000, 2), ('Blue', 'Gosho', 10000, 2)]

, а затем отсортировать с помощью лямбда-функции, в которой используются 2 условия сравнения (score, size of group).

>>> sorted(l2, key=lambda x:(int(x[2]),x[3]),reverse=True)
[('Blue', 'Pesho', 10000, 2), ('Blue', 'Gosho', 10000, 2), ('Red', 'Pesho', 10000, 1)]
...