У меня есть словарь значений, считываемых из двух полей в базе данных: строкового поля и числового поля. Строковое поле уникально, так что это ключ словаря.
Я могу выполнить сортировку по ключам, но как я могу выполнить сортировку на основе значений?
Примечание: Я прочитал здесь вопрос 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 insorted(x.items(), key=lambda item: item[1])} {0: 0, 2: 1, 1: 2, 4: 3, 3: 4}
Невозможно отсортировать словарь, только чтобы получить представление отсортированного словаря. Словари по своей сути не имеют порядка, но другие типы, такие как списки и кортежи, нет. Итак, вам нужен упорядоченный тип данных для представления отсортированных значений, который будет представлять собой список — возможно, список кортежей.
Ну, на самом деле можно выполнить "сортировку по значениям словаря". Недавно мне пришлось сделать это в 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 insorted(d, key=d.get, reverse=True): print(w, d[w])
Я пишу это подробное объяснение, чтобы проиллюстрировать, что люди часто подразумевают под "Я могу легко отсортировать словарь по ключу, но как мне отсортировать по значению" - и я думаю, что первоначальный пост пытался решить такую проблему. И решение состоит в том, чтобы выполнить сортировку списка ключей на основе значений, как показано выше.
Ответ 3
Вы могли бы использовать:
sorted(d.items(), key=lambda x: x[1])
Это позволит отсортировать словарь по значениям каждой записи в словаре от наименьшего к наибольшему.
Чтобы отсортировать его в порядке убывания, просто добавьте reverse=True: