Python

Как отсортировать словарь в Python

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

В современном Python словарь сохраняет порядок вставки, но это не отменяет сортировку. Если нужен алфавитный вывод, рейтинг по числам или топ-3, порядок нужно задать явно

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

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Сортировка по ключам

Самый простой вариант — пройти по отсортированным ключам

prices = {"tea": 120, "coffee": 250, "juice": 180}

for name in sorted(prices):
    print(name, prices[name])

sorted(prices) возвращает список ключей. Исходный словарь при этом не меняется

Сортировка по значениям

Чтобы сортировать по цене, нужно работать с парами items

prices = {"tea": 120, "coffee": 250, "juice": 180}

sorted_items = sorted(prices.items(), key=lambda item: item[1])
print(sorted_items)

Здесь item[0] — ключ, а item[1] — значение. Для новичка полезно вывести prices.items() отдельно и посмотреть, что именно сортируется

Новый словарь после сортировки

Если нужен снова словарь, оберните результат в dict

prices = {"tea": 120, "coffee": 250, "juice": 180}

sorted_prices = dict(sorted(prices.items(), key=lambda item: item[1]))
print(sorted_prices)
print(prices)

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

Сортировка по убыванию

Для рейтинга или топа обычно нужен обратный порядок

scores = {"Анна": 80, "Илья": 95, "Мария": 88}

rating = sorted(scores.items(), key=lambda item: item[1], reverse=True)
print(rating)

Если нужен топ-3, возьмите срез

top_3 = rating[:3]
print(top_3)

Практика: частотность слов

Соберите словарь частот и отсортируйте его по количеству повторов

text = "python sql python html sql python"
counts = {}

for word in text.split():
    counts[word] = counts.get(word, 0) + 1

popular = sorted(counts.items(), key=lambda item: item[1], reverse=True)
print(popular)

Такой пример ближе к реальным задачам: поиск частых тегов, ошибок, городов, товаров или запросов

Частые ошибки

  • думать, что sorted меняет исходный словарь
  • сортировать ключи, когда нужна сортировка по значениям
  • забывать reverse=True для рейтинга
  • писать сложный lambda, не понимая, что лежит в item
  • терять формат результата: список пар и словарь ведут себя по-разному

Как проверить результат

Проверьте пустой словарь, один элемент, одинаковые значения и отрицательные числа. Если при одинаковых значениях порядок важен, задайте дополнительное правило, например сортировку по имени

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

Если у двух элементов одинаковое значение, можно добавить второе правило сортировки. Например, сначала сортировать по баллам по убыванию, а при равенстве — по имени

scores = {"Мария": 95, "Анна": 95, "Илья": 80}

rating = sorted(
    scores.items(),
    key=lambda item: (-item[1], item[0])
)

print(rating)

Здесь минус перед баллами дает убывание, а имя остается в обычном алфавитном порядке

Сортировка словаря со вложенными данными

Часто значения словаря сами являются словарями. Тогда ключ сортировки нужно брать глубже

products = {
    "coffee": {"title": "Кофе", "price": 790},
    "tea": {"title": "Чай", "price": 420},
    "cocoa": {"title": "Какао", "price": 560},
}

sorted_products = sorted(
    products.items(),
    key=lambda item: item[1]["price"]
)

for code, product in sorted_products:
    print(code, product["title"], product["price"])

Такой пример полезен для каталогов, настроек, отчетов и данных из JSON

Когда не нужно собирать новый словарь

Если задача только вывести рейтинг, оставьте результат списком пар. Новый словарь нужен, когда дальше код должен работать именно со словарем. Для таблицы, отчета или консольного вывода список пар часто понятнее

Проверьте себя так: если после сортировки вы сразу запускаете цикл и печатаете строки, dict(...) лишний. Если хотите передать отсортированные данные дальше как структуру, новый словарь может быть удобен

Итоговая тренировка: рейтинг товаров

Соберите словарь товаров и выведите сначала самые дорогие позиции, потом самые дешевые. Это закрепляет items, lambda, reverse и срезы

prices = {
    "Кофе": 790,
    "Чай": 420,
    "Какао": 560,
    "Печенье": 310,
}

expensive = sorted(prices.items(), key=lambda item: item[1], reverse=True)
cheap = sorted(prices.items(), key=lambda item: item[1])

print("Дороже всего:", expensive[:2])
print("Дешевле всего:", cheap[:2])

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

result = sorted(prices.items(), key=lambda item: (item[1], item[0]))
print(result)

Как объяснить решение словами

Хороший ответ на вопрос про сортировку словаря звучит не как «используйте lambda», а как последовательность: берем пары ключ-значение через items, выбираем, что сравнивать, передаем это в key, при необходимости включаем reverse, затем решаем, нужен список пар или новый словарь

Если вы можете проговорить эти шаги без подсказки, значит вы понимаете сортировку, а не просто копируете строчку

Как проверить, что сортировка работает

Проверьте себя на трех вариантах. Первый: отсортировать словарь цен по названию товара. Второй: отсортировать по цене от дешевого к дорогому. Третий: вывести два самых дорогих товара. Если во всех трех решениях понятно, где ключ, где значение и что именно сравнивает lambda, тема усвоена

Не забывайте про формат результата. sorted(prices) дает ключи, sorted(prices.items()) дает пары, dict(sorted(...)) снова собирает словарь. Ошибки часто начинаются именно с того, что человек ожидает один формат, а получает другой. Поэтому после сортировки полезно временно вывести результат через print(type(result), result)

Что запомнить про сортировку

Для сортировки словаря держите в голове три варианта. sorted(data) сортирует ключи. sorted(data.items(), key=lambda item: item[1]) сортирует пары по значениям. dict(sorted(...)) нужен только тогда, когда после сортировки снова требуется словарь. Если нужен отчет или топ, чаще достаточно списка пар

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

prices = {"coffee": 250, "tea": 120, "juice": 180}

by_name = dict(sorted(prices.items()))
by_price = dict(sorted(prices.items(), key=lambda item: item[1]))

print(by_name)
print(by_price)

sorted(prices.items()) сортирует пары по ключу. Если нужен порядок по значению, укажите key=lambda item: item[1]. Для новичка это важный момент: сортируется не сам словарь как коробка, а последовательность пар ключ-значение

Список словарей: частый реальный случай

products = [
    {"title": "Кофе", "price": 250},
    {"title": "Чай", "price": 120},
    {"title": "Сок", "price": 180},
]

result = sorted(products, key=lambda product: product["price"])
print(result)

Такой вариант встречается в каталогах, таблицах, парсерах и выгрузках. Если поле может отсутствовать, используйте product.get("price", 0), но только когда ноль действительно безопасен

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x