Опубликован: 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() значение по умолчанию для отсутствующих ключей
Методы преобразования списка в строку и обратно
Комментариев нет.