Рубрики
Без рубрики

OrderedDict – помните, что ключи заказа добавлены в словарь

Автор оригинала: 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 – переменная среды для управления случайным начальным значением, добавляемым в алгоритм хеширования для ключевых местоположений. в словаре.