Сортировать словарь по значению в Python - PullRequest
0 голосов
/ 20 марта 2019

Это мой словарь:

d = {'jan': 50, 'feb': 30, 'march': 60, 'april': 50, 'may': 50, 'june': 60, 'july': 20}

Я ожидаю вывод, подобный этому:

d = {'jan': 50, 'april': 50, 'may': 50, 'march': 60, 'june': 60, 'feb': 30, 'july': 20}

Когда я запускаю эту программу, я получаю вывод, отличный от ожидаемого:

d = {'jan': 50, 'feb': 30, 'march': 60, 'april': 50, 'may': 50, 'june': 60, 'july': 20}
sortlist = sorted(d, key=d.get)
print(sortlist)

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы можете начать с подсчета количества раз, когда каждое значение появляется с collections.Counter:

from collections import Counter
c = Counter(d.values())
# Counter({20: 1, 30: 1, 50: 3, 60: 2})

А теперь отсортируйте словарь, посмотрев, сколько раз каждое значение появляется, используя key в sorted:

sorted(d.items(), key=lambda x: c[x[1]], reverse=True)
[('jan', 50), ('april', 50), ('may', 50), ('march', 60), ('june', 60), 
 ('feb', 30), ('july', 20)]

Обратите внимание, однако, что если вы получите словарь из результата, порядок не будет поддерживаться, так как словари не имеют порядка.

Итак, вы можете использовать collections.OrderedDict, чтобы сохранить порядок, просто наберите OrderedDict(res) в результирующем списке кортежей.

0 голосов
/ 20 марта 2019
d={'january': 500, 'feb':600, 'march':300,'april':500,'may':500,'june':600,'july':200}

from collections import defaultdict
from collections import OrderedDict

count_dict = defaultdict(int)
for key, value in d.items():
  count_dict[value] += 1

Сначала мы подсчитываем вхождения каждого значения. Counter может использоваться вместо defaultdict. Затем отсортируйте их в соответствии с count_dict таблицей поиска, которую мы только что создали.

sorted_dict = OrderedDict(sorted(d.items(), key=lambda item: count_dict[item[1]], reverse=True))
print(sorted_dict)

>>> OrderedDict([('january', 500), ('april', 500), ('may', 500), ('feb', 600), ('june', 600), ('march', 300), ('july', 200)])

Обновление: Вы можете создать count_dict с Counter, например:

from collections import Counter

count_dict = Counter(d.values())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...