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

Основные подходы

1. Использование sorted с lambda

data = {'яблоки': 40, 'апельсины': 80, 'бананы': 30}

# Сортировка по возрастанию значений
sorted_data = dict(sorted(data.items(), key=lambda item: item[1]))
print(sorted_data)
# {'бананы': 30, 'яблоки': 40, 'апельсины': 80}

# Сортировка по убыванию
sorted_data_desc = dict(sorted(data.items(), key=lambda item: item[1], reverse=True))
print(sorted_data_desc)
# {'апельсины': 80, 'яблоки': 40, 'бананы': 30}

Разбор:

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

2. Использование operator.itemgetter

from operator import itemgetter

data = {'яблоки': 40, 'апельсины': 80, 'бананы': 30}
sorted_data = dict(sorted(data.items(), key=itemgetter(1)))

Плюсы:

  • Чуть быстрее чем lambda для больших объемов данных
  • Более явный и читаемый код

3. Сортировка словаря с сохранением порядка

Начиная с Python 3.7 словари сохраняют порядок вставки:

data = {'яблоки': 40, 'апельсины': 80, 'бананы': 30}
sorted_dict = {}
for key, value in sorted(data.items(), key=lambda item: item[1]):
    sorted_dict[key] = value

4. Использование dictionary comprehension

data = {'яблоки': 40, 'апельсины': 80, 'бананы': 30}
sorted_data = {k: v for k, v in sorted(data.items(), key=lambda item: item[1])}

Сложные случаи сортировки

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

data = {'a': -5, 'b': 3, 'c': -1, 'd': 4}
sorted_data = dict(sorted(data.items(), key=lambda item: abs(item[1])))
# {'c': -1, 'b': 3, 'd': 4, 'a': -5}

Сортировка составных значений

users = {
    'Alice': {'age': 25, 'score': 90},
    'Bob': {'age': 30, 'score': 85},
    'Charlie': {'age': 22, 'score': 95}
}

# Сортировка по возрасту
sorted_by_age = dict(sorted(users.items(), key=lambda item: item[1]['age']))

# Сортировка по score
sorted_by_score = dict(sorted(users.items(), key=lambda item: item[1]['score'], reverse=True))

Производительность

Для очень больших словарей лучше использовать:

# Минимальное потребление памяти
sorted_pairs = sorted(data.items(), key=itemgetter(1))
result = dict(sorted_pairs)

Альтернативные структуры данных

Если нужно часто сортировать и обновлять данные, рассмотрите:

from collections import OrderedDict

sorted_ordered_dict = OrderedDict(sorted(data.items(), key=lambda x: x[1]))

Резюмируем

  1. Основной способ: sorted(data.items(), key=lambda item: item[1]) + dict()
  2. Для читаемости: используйте itemgetter вместо lambda
  3. В новых версиях Python (3.7+): порядок вставки сохраняется
  4. Для сложных случаев: адаптируйте key-функцию
  5. Для максимальной производительности: избегайте промежуточных преобразований

Выбор метода зависит от конкретной задачи, версии Python и требований к производительности.