Сортировать словарь по значению в python

#python #sorting #dictionary

#python #сортировка #словарь

Вопрос:

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

 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)
  

Комментарии:

1. Если вы хотите выполнить сортировку по количеству дубликатов, то вам нужно произвести некоторый подсчет… key=d.get очевидно, что это не поможет.

2. Было бы полезно, если бы вы могли предоставить немного больше информации о том, чего вы на самом деле пытаетесь достичь? В нынешнем виде это очень неясно, по крайней мере, для меня.

3. Похоже, это задание для Counter . Возможно, подсчитать повторяющиеся значения dict, а затем отобразить их в порядке описания

4. Я предполагаю, что вы хотите сделать эти 3 вещи, 1: подсчитать, сколько раз появлялось число, 2: отсортировать по количеству, 3: если число такое же, отсортировать по месяцам в ключе. Правильно?

5. @Ramani как именно вы хотите , чтобы ваш dict был отсортирован ? Неясно, хотите ли вы, чтобы он сортировался по ключу или значению

Ответ №1:

Вы можете начать с подсчета количества раз, с которым появляется каждое значение 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) результирующий список кортежей.

Ответ №2:

 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())