Вопрос-Ответ

How do I sort a dictionary by value?

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

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

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

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

Переведено автоматически
Ответ 1

Python 3.7+ или CPython 3.6

Dicts сохраняет порядок вставки в Python 3.7+. То же самое в CPython 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}

или

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

Старый Python

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

Например,

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, поскольку распаковка не разрешена, мы можем использовать

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

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

import collections

sorted_dict = collections.OrderedDict(sorted_x)
Ответ 2

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

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

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

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

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

Ответ 3

Вы могли бы использовать:

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

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

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

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

Ввод:

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

Вывод:

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

Dicts нельзя отсортировать, но вы можете создать из них отсортированный список.

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

sorted(d.values())

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

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