Сортировка словарей производится при помощи встроенной функцией sorted()
и происходит немного сложнее чем сортировка списков или кортежей.
Функция sorted()
работает со всеми объектами, которые поддерживают итерирование. Словарь, в свою очередь при итерировании, выдает только ключи, но нам необходимо получить исходный отсортированный словарь, а не только отсортированные ключи. Следовательно из словаря необходимо получить итерацию [(key, val), (key, val), ...]
, затем отсортировать ее по значению key
и преобразовать обратно в словарь.
Список кортежей (key, val)
можно получить методом словаря dict.items()
.
>>> d = {'b': 9, 'a': 3, 'c': 7} # получаем итерацию кортежей `(key, val)` >>> d.items() # dict_items([('b', 9), ('a', 3), ('c', 7)]) # то что нужно
Так как значение key
стоит первым, то и ключ для сортировки укажем как lambda x: x[0]
, где x - это кортеж (key, val)
# исходный словарь >>> d = {'b': 9, 'a': 3, 'c': 7} # собственно сама сортировка >>> sorted_tuple = sorted(d.items(), key=lambda x: x[0]) # получили отсортированный список кортежей, # отсортированных по первому значению >>> sorted_tuple # [('a', 3), ('b', 9), ('c', 7)] # преобразовываем обратно в словарь dict(sorted_tuple) # {'a': 3, 'b': 9, 'c': 7}
Применяя методику сортировки описанную выше, можно легко догадаться как сортировать словарь по значению. Для этого просто укажем в качестве ключа сортировки индекс значения словаря в полученном списке кортежей: lambda x: x[1]
, где x - это кортеж (key, val)
>>> d = {'b': 9, 'a': 3, 'c': 7} >>> sorted_tuple = sorted(d.items(), key=lambda x: x[1]) >>> sorted_tuple # [('a', 3), ('c', 7), ('b', 9)] # преобразовываем обратно в словарь >>> dict(sorted_tuple) # {'a': 3, 'c': 7, 'b': 9}
Теперь запишем в одну строку:
>>> d = {'b': 9, 'a': 3, 'c': 7} >>> {k: v for k, v in sorted(d.items(), key=lambda item: item[1])} # {'a': 3, 'c': 7, 'b': 9}
Для получения ключа сортировки из dict.items()
, так же можно использовать функцию operator.itemgetter()
:
>>> d = {'b': 9, 'a': 3, 'c': 7} >>> import operator >>> sorted_tuple = sorted(d.items(), key=operator.itemgetter(1)) >>> sorted_tuple # [('a', 3), ('c', 7), ('b', 9)] >>> dict(sorted_tuple) # {'a': 3, 'c': 7, 'b': 9} # и в одну строку {k: v for k, v in sorted(d.items(), key=operator.itemgetter(1)} # {'a': 3, 'c': 7, 'b': 9}
sortedcontainers
Для быстрой сортировки словаря dict
необходимо установить сторонний модуль pip install sortedcontainers
(желательно в виртуальное окружение).
Этот модуль предназначен для быстрой (как C-расширение) сортировки коллекций, таких как list
, set
, dict
.
>>> from sortedcontainers import SortedDict >>> sd = SortedDict({'c': -3, 'a': 1, 'b': 2}) >>> sd # SortedDict({'a': 1, 'b': 2, 'c': -3}) >>> sd.popitem(index=-1) # ('c', -3)
Код выше, выполняются быстрее линейного времени и потребляет на 66% меньше накладных расходов.