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

Опубликован: 25.09.2023 113

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

В Python для сортировки словарей (и других итерируемых объектов) используется функция sorted(), которая возвращает новый отсортированный список итерируемого объекта.

Синтаксис : sorted( iterable, key=None, reverse=False)

  • iterable: строка, список, кортеж, множество, словарь;
  • key (необязательный параметр): если указать ключ, то сортировка будет выполнена по функции этого ключа;
  • reverse (необязательный параметр): по умолчанию сортировка выполняется по возрастанию. Если указать reverse=True, то можно отсортировать по убыванию.

Если просто передать в функцию sorted() словарь, то на выходе мы получим список отсортированных ключей, а не словарь. А если передать метод словаря d.items(), то получим отсортированный список кортежей (key, value):

d = {'сливы': 125, 'арбуз': 50, 'лимоны': 95, 'бананы': 130}

# список отсортированных ключей словаря
print(sorted(d))
['арбуз', 'бананы', 'лимоны', 'сливы']

# отсортированный список кортежей (key, value)
print(sorted(d.items() ) )
[('арбуз', 50), ('бананы', 130), ('лимоны', 95), ('сливы', 125)]

Но, если в функции sorted() вторым параметром в качестве ключа сортировки указать значения словаря value в отсортированном кортеже (используя для этого lambda функцию lambda x: (x[1])), то мы получим словарь, отсортированный по значениям:

# сортировка словаря по значениям с lambda функцией
d = {'сливы': 125, 'арбуз': 50, 'лимоны': 95, 'бананы': 130}
print( dict( sorted( d.items(), key=lambda x: x[1] ) ) )
{'арбуз': 50, 'лимоны': 95, 'сливы': 125, 'бананы': 130}

Кроме lambda функции для получения ключа сортировки из d.items(), так же можно использовать функцию operator.itemgetter() встроенного модуля operator.

itemgetter(n) принимает итерируемый объект (список, кортеж, множество) и возвращает n-элемент объекта:

from operator import itemgetter

# сортировка словаря по значениям с itemgetter
d = {'сливы': 125, 'арбуз': 50, 'лимоны': 95, 'бананы': 130}
print( dict( sorted( d.items(), key=itemgetter(1) ) ) )

{'арбуз': 50, 'лимоны': 95, 'сливы': 125, 'бананы': 130}

# сортировка списка словарей по нескольким параметрам
people = [{'first': 'Vladimir', 'last': 'Petrov', 'email': 'vlad.petrov@mail.ru'},
                 {'first': 'Michail', 'last': 'Lomonosov', 'email': 'michail_lomonosov@ya.ru'},
                 {'first': 'Petr', 'last': 'Simonov', 'email': 'PSimon@gmail.com'}]

# функция сортировки списка словарей по двум параметрам last и  first
def alphabetize_names (list_of_dicts):
    return sorted (list_of_dicts, key=itemgetter ("last", "first"))

print (alphabetize_names (people))

# [{'first': 'Michail', 'last': 'Lomonosov', 'email': 'michail_lomonosov@ya.ru'}, 
# {'first': 'Vladimir', 'last': 'Petrov', 'email': 'vlad.petrov@mail.ru'}, 
# {'first': 'Petr', 'last': 'Simonov', 'email': 'PSimon@gmail.com'}]

Похожие посты

Генератор словарей (Dict comprehension)

Использование метода dict.setdefault() для эффективной работы со словарем

Метод dict.get() значение по умолчанию для отсутствующих ключей

Методы преобразования списка в строку и обратно

Комментариев нет.