Автор оригинала: Doug Hellmann.
OrderedDict
– это подкласс словаря, который запоминает порядок добавления его содержимого.
collections_ordereddict_iter.py
import collections print('Regular dictionary:') d {} d['a'] 'A' d['b'] 'B' d['c'] 'C' for k, v in d.items(): print(k, v) print('\nOrderedDict:') d collections.OrderedDict() d['a'] 'A' d['b'] 'B' d['c'] 'C' for k, v in d.items(): print(k, v)
До Python 3.6 обычный dict
не отслеживал порядок вставки, и повторение по нему производило значения в порядке, основанном на том, как ключи хранятся в хэш-таблице, на которую, в свою очередь, влияет случайное значение чтобы уменьшить столкновения. В OrderedDict
, напротив, порядок, в котором вставляются элементы, запоминается и используется при создании итератора.
$ python3.5 collections_ordereddict_iter.py Regular dictionary: c C b B a A OrderedDict: a A b B c C
В Python 3.6 встроенный dict
отслеживает порядок вставки, хотя такое поведение является побочным эффектом изменения реализации и на него не следует полагаться.
$ python3.6 collections_ordereddict_iter.py Regular dictionary: a A b B c C OrderedDict: a A b B c C
Равенство
Обычный dict
проверяет свое содержимое при проверке равенства. OrderedDict
также учитывает порядок, в котором были добавлены элементы.
collections_ordereddict_equality.py
import collections print('dict :', end' ') d1 {} d1['a'] 'A' d1['b'] 'B' d1['c'] 'C' d2 {} d2['c'] 'C' d2['b'] 'B' d2['a'] 'A' print(d1 d2) print('OrderedDict:', end' ') d1 collections.OrderedDict() d1['a'] 'A' d1['b'] 'B' d1['c'] 'C' d2 collections.OrderedDict() d2['c'] 'C' d2['b'] 'B' d2['a'] 'A' print(d1 d2)
В этом случае, поскольку два упорядоченных словаря созданы из значений в разном порядке, они считаются разными.
$ python3 collections_ordereddict_equality.py dict : True OrderedDict: False
Изменение порядка
Можно изменить порядок ключей в OrderedDict
, переместив их либо в начало, либо в конец последовательности с помощью move_to_end ()
.
collections_ordereddict_move_to_end.py
import collections d collections.OrderedDict( [('a', 'A'), ('b', 'B'), ('c', 'C')] ) print('Before:') for k, v in d.items(): print(k, v) d.move_to_end('b') print('\nmove_to_end():') for k, v in d.items(): print(k, v) d.move_to_end('b', lastFalse) print('\n
Аргумент last
сообщает move_to_end ()
, следует ли переместить элемент так, чтобы он был последним элементом в последовательности клавиш (когда True
) или первым ( когда False
).
$ python3 collections_ordereddict_move_to_end.py Before: a A b B c C move_to_end(): a A c C b B b B a A c C
Смотрите также
- PYTHONHASHSEED – переменная среды для управления случайным начальным значением, добавляемым в алгоритм хеширования для ключевых местоположений. в словаре.