Основы сортировки словарей в языке Python

Раздел: Основы Python -> Словари

Основной способ сортировки словаря

Словарь в Python не поддерживает сортировку напрямую, так как до версии 3.7 порядок элементов не гарантировался. Начиная с Python 3.7 словари сохраняют порядок вставки, поэтому отсортированный словарь может быть полезен, если нужно получить упорядоченный вывод. Самый эффективный метод для создания отсортированного словаря — использование функции sorted() в сочетании с методом items() и последующим преобразованием результата обратно в словарь.


# Исходный словарь
data = {'banana': 3, 'apple': 5, 'cherry': 2, 'date': 4}

# Сортировка по ключам (по умолчанию)
sorted_dict = dict(sorted(data.items()))
print(sorted_dict)

словарь слов python (словарь слов в python)

{'apple': 5, 'banana': 3, 'cherry': 2, 'date': 4}

Python значение ключа словаря (значение ключа словаря в python)

Пояснение: data.items() возвращает список кортежей (ключ, значение). sorted() сортирует эти кортежи по первому элементу (ключу) в лексикографическом порядке. dict() создаёт новый словарь, сохраняя порядок элементов после сортировки.

Типичная ошибка:

Попытка отсортировать сам словарь без вызова items():


sorted_dict = dict(sorted(data))  # Ошибка! sorted(data) вернёт список ключей

ключ значение в python (пары ключ-значение в python)

Результат: выбрасывается TypeError, так как dict не может быть создан из списка строк без указания значений.

Проблема с сохранением типа:

После сортировки словарь можно потерять, если не преобразовать обратно. Иногда достаточно получить список кортежей, но для дальнейших операций со словарём требуется преобразование.

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


data = {'banana': 3, 'apple': 5, 'cherry': 2, 'date': 4}
sorted_by_value = dict(sorted(data.items(), key=lambda item: item[1]))
print(sorted_by_value)

получить значение ключа python (получение значения ключа в python)

{'cherry': 2, 'banana': 3, 'date': 4, 'apple': 5}

Python получить ключ (получение ключа словаря в python)

Параметр key указывает функцию, возвращающую значение для сортировки. Здесь lambda item: item[1] извлекает значение (второй элемент кортежа).

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


sorted_by_value_desc = dict(sorted(data.items(), key=lambda item: item[1], reverse=True))
print(sorted_by_value_desc)

словарь значения python (словарь значений в python)

{'apple': 5, 'date': 4, 'banana': 3, 'cherry': 2}

список значений словаря python (список значений словаря в python)

Флаг reverse=True меняет порядок сортировки на убывающий.

Как отсортировать словарь с помощью модуля operator?


from operator import itemgetter
data = {'banana': 3, 'apple': 5, 'cherry': 2, 'date': 4}
sorted_by_value = dict(sorted(data.items(), key=itemgetter(1)))
print(sorted_by_value)

удаление словаря python (удаление элемента из словаря в python)

{'cherry': 2, 'banana': 3, 'date': 4, 'apple': 5}

добавление в словарь python (добавление в словарь python)

itemgetter(1) аналогична лямбда-функции, но работает быстрее при большом объёме данных.

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


data = {'pear': 1, 'kiwi': 2, 'plum': 3, 'pineapple': 4}
sorted_by_len_key = dict(sorted(data.items(), key=lambda item: len(item[0])))
print(sorted_by_len_key)

Python dict add (добавление элемента в словарь python)

{'pear': 1, 'kiwi': 2, 'plum': 3, 'pineapple': 4}

Python найти в словаре (поиск ключа в словаре python)

Ключи сортируются по возрастанию длины строки.

Проблема с многокритериальной сортировкой:

Если нужно сортировать сначала по значению, а затем по ключу (при равенстве значений), можно использовать кортеж в лямбда-функции:


data = {'banana': 3, 'apple': 3, 'cherry': 2, 'date': 2}
sorted_multi = dict(sorted(data.items(), key=lambda item: (item[1], item[0])))
print(sorted_multi)

Python элемент словаря по ключу (получение элемента словаря по ключу)

{'cherry': 2, 'date': 2, 'apple': 3, 'banana': 3}

Сначала сравниваются значения, затем ключи в алфавитном порядке.

- создать dict python (создание словаря в python)
- Python sort dict (сортировка словаря в python)
- Key list python (список ключей словаря python)

Расширенные примеры сортировки словарей

Сортировка и сохранение в OrderedDict (для обратной совместимости)

Пример

from collections import OrderedDict
data = {'banana': 3, 'apple': 5, 'cherry': 2}
sorted_ordered = OrderedDict(sorted(data.items(), key=lambda x: x[1]))
print(sorted_ordered)
OrderedDict([('cherry', 2), ('banana', 3), ('apple', 5)])

В Python < 3.7 словари не сохраняли порядок, поэтому использовали OrderedDict. Современные версии могут обойтись обычным dict, но OrderedDict всё ещё полезен для явного указания намерения.

Сортировка вложенного словаря по значению внутреннего ключа

Пример

data = {
    'item1': {'name': 'apple', 'price': 10},
    'item2': {'name': 'banana', 'price': 5},
    'item3': {'name': 'cherry', 'price': 15}
}
sorted_by_price = dict(sorted(data.items(), key=lambda x: x[1]['price']))
print(sorted_by_price)
{'item2': {'name': 'banana', 'price': 5}, 'item1': {'name': 'apple', 'price': 10}, 'item3': {'name': 'cherry', 'price': 15}}

При сортировке по внутреннему значению извлекается поле из словаря-значения.

Сортировка по ключу, заданному функцией-компаратором (functools.cmp_to_key)

Пример

from functools import cmp_to_key
data = {'apple': 10, 'Banana': 5, 'cherry': 1}

def custom_cmp(a, b):
    return (a[0].lower() > b[0].lower()) - (a[0].lower() < b[0].lower())

sorted_custom = dict(sorted(data.items(), key=cmp_to_key(custom_cmp)))
print(sorted_custom)
{'apple': 10, 'Banana': 5, 'cherry': 1}

cmp_to_key преобразует старый стиль сравнения в функцию ключа. В данном примере сортировка происходит без учёта регистра.

Сортировка словаря по ключам, которые являются числами

Пример

data = {3: 'three', 1: 'one', 2: 'two'}
sorted_numeric = dict(sorted(data.items()))
print(sorted_numeric)
{1: 'one', 2: 'two', 3: 'three'}

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

Сортировка по значению с дополнительным условием (фильтрация)

Пример

data = {'a': 3, 'b': -1, 'c': 0, 'd': 5}
filtered_sorted = dict(sorted(
    ((k, v) for k, v in data.items() if v > 0),
    key=lambda x: x[1]
))
print(filtered_sorted)
{'a': 3, 'd': 5}

Сначала отфильтровываются элементы с отрицательными и нулевыми значениями, затем оставшиеся сортируются.

Использование attrgetter для сортировки значений-объектов

Пример

from operator import attrgetter

class Fruit:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def __repr__(self):
        return f'{self.name}:{self.price}'

data = {
    'first': Fruit('apple', 10),
    'second': Fruit('banana', 5),
    'third': Fruit('cherry', 15)
}
sorted_by_price = dict(sorted(data.items(), key=lambda x: x[1].price))
# Аналогично с attrgetter:
sorted_by_price2 = dict(sorted(data.items(), key=lambda x: attrgetter('price')(x[1])))
print(sorted_by_price2)
{'second': banana:5, 'first': apple:10, 'third': cherry:15}

При сортировке объектов в значениях удобно использовать attrgetter для доступа к атрибутам.

Сортировка словаря в Python - comments

En
Python sort dict (python)