Как отсортировать словарь по значению.

python sorting dictionary


У меня есть словарь значений,читаемых из двух полей в базе данных:строковое и числовое.Строковое поле уникально,поэтому оно является ключом словаря.

Я могу сортировать по клавишам,но как я могу сортировать по значениям?

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




Answer 1 Devin Jeanpierre


Питон 3.6+

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

Старший Питон

Сортировать словарь невозможно, только чтобы получить представление отсортированного словаря. Словари по своей природе беспорядочные, а другие типы, такие как списки и кортежи, - нет. Таким образом, вам нужен упорядоченный тип данных для представления отсортированных значений, который будет списком - вероятно, списком кортежей.

Например,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x будет список кортежей, отсортированных по второму элементу в каждом кортеже. dict(sorted_x) == x .

А для тех,кто хочет сортировать по клавишам,а не по значениям:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

В Python3, поскольку распаковка запрещена [1], мы можем использовать

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

Если вы хотите вывод как дикт, вы можете использовать collections.OrderedDict :

import collections

sorted_dict = collections.OrderedDict(sorted_x)



Answer 2 Nas Banov


Так же просто, как: sorted(dict1, key=dict1.get)

Ну, на самом деле можно сделать «сортировку по значениям словаря». Недавно мне пришлось сделать это в Code Golf (вопрос о переполнении стека Code golf: Word частотная диаграмма ). Сокращенно, проблема была в следующем: по тексту посчитайте, как часто встречается каждое слово и отобразите список главных слов, отсортированных по убыванию частоты.

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

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
    d[w] += 1

затем вы можете получить список слов, упорядоченных по частоте использования, с sorted(d, key=d.get) - сортировка перебирает ключи словаря, используя количество вхождений слов в качестве ключа сортировки.

for w in sorted(d, key=d.get, reverse=True):
    print(w, d[w])

Я пишу это подробное объяснение,чтобы проиллюстрировать,что люди часто имеют в виду,говоря о том,что "я легко могу отсортировать словарь по клавишам,но как я могу отсортировать по значению"-и я думаю,что в оригинальном сообщении была предпринята попытка решить эту проблему.И решение заключается в том,чтобы сделать своего рода список ключей,основываясь на значениях,как показано выше.




Answer 3 Mark


Тебе бы не помешало:

sorted(d.items(), key=lambda x: x[1])

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

Чтобы отсортировать его в порядке убывания, просто добавьте reverse=True :

sorted(d.items(), key=lambda x: x[1], reverse=True)

Input:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

Output:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]



Answer 4 Roberto Bonvallet


Книги не могут быть отсортированы,но из них можно составить отсортированный список.

Сортированный список значений диктата:

sorted(d.values())

Список пар (ключ,значение),отсортированных по значению:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))



Answer 5 mykhal


В недавнем Python 2.7 у нас появился новый тип OrderedDict , который запоминает порядок, в котором элементы были добавлены.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

Сделать новый упорядоченный словарь из оригинала,отсортировав его по значениям:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

Ордеддикт ведет себя как нормальный диктат:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])