Шаг 8.
Python: сборник рецептов.
Структуры данных и алгоритмы. Поддержание порядка в словарях

    На этом шаге мы рассмотрим способ поддержания такого порядка.

Задача

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

Решение

    Чтобы контролировать порядок элементов в словаре, вы можете использовать OrderedDict из модуля collections. При итерировании он в

точности сохраняет изначальный порядок добавления данных. Например:
from collections import OrderedDict

d = OrderedDict() 
d['foo'] = 1 
d['bar'] = 2 
d['spam'] = 3 
d['grok'] = 4
# Выведет "foo 1", "bar 2", "spam 3", "grok 4" 
for key in d:
    print(key, d[key])

    OrderedDict особенно полезен, когда вы хотите создать отображение, которое в дальнейшем собираетесь сериализовать или закодировать в другой формат. Например, если вы хотите строго контролировать порядок полей, выводимых в формате JSON, вам нужно просто создать OrderedDict с нужными данными:

>>> import json 
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}'
>>>


Обсуждение

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

    Заметьте, что размер OrderedDict более чем в два раза превышает размер обычного словаря из-за содержащегося внутри дополнительного списка. А если вы собираетесь создать структуру данных, в которой будет большое число экземпляров OrderedDict (например, вы хотите прочитать 100 000 строк CSV-файла в список экземпляров OrderedDict), вам стоит изучить требования вашего приложения, чтобы решить, перевесят ли преимущества использования OrderedDict затраты на дополнительную память.

    На следующем шаге мы рассмотрим вычисления со словарями.




Предыдущий шаг Содержание Следующий шаг