import collections collections.OrderedDict([items])
items
- список кортежей (key, value)
.Класс OrderedDict()
модуля collections
возвращает экземпляр подкласса dict
, у которого есть методы, специализированные для изменения порядка словаря.
Упорядоченные словари похожи на обычные словари, но имеют некоторые дополнительные возможности, связанные с операциями упорядочивания. Теперь они стали менее важными, когда встроенный класс dict
получил возможность запоминать порядок вставки (это новое поведение стало гарантированным в Python 3.7).
Некоторые отличия от встроенного класса dict
:
dict
был разработан для быстрых операций добавления, извлечения и обновления данных.collections.OrderedDict()
был разработан для частыx операций переупорядочивания. Эффективность использования памяти, скорость итераций и производительность операций обновления были второстепенными.collections.OrderedDict()
может обрабатывать частые операции переупорядочения лучше, чем обычный словарь dict
. Это делает его подходящим для отслеживания недавних обращений например, в кеш LRU.OrderedDict
проверяет соответствие порядка ключей..popitem()
класса OrderedDict()
имеет другую сигнатуру. Он принимает необязательный аргумент, чтобы указать, какой элемент появляется.OrderedDict
имеет метод .move_to_end()
для эффективного перемещения элемента в конечную точку.dict
отсутствовал метод __reversed__()
.OrderedDict()
.od.popitem(last=True)
:Метод od.popitem()
для упорядоченных словарей возвращает и удаляет пару (key, value)
. Пары (key, value)
возвращаются в порядке LIFO
, если аргумент last=True
или в порядке FIFO
, если last=False
.
od.move_to_end(key, last=True)
:Метод od.move_to_end()
перемещает существующий ключ key
в начало/конец упорядоченного словаря. Элемент перемещается в правый конец, если аргумент last=True
(по умолчанию), или в начало, если last=False
. Вызывает исключение KeyError
, если ключ не существует:
>>> d = OrderedDict.fromkeys('abcde') >>> d.move_to_end('b') >>> ''.join(d.keys()) 'acdeb' >>> d.move_to_end('b', last=False) >>> ''.join(d.keys()) 'bacde'
Проверка на равенство между объектами collections.OrderedDict()
чувствительно к порядку ключ/значение и реализовано как list(od1.items())
==list(od2.items())
.
Проверка на равенство между объектами collections.OrderedDict()
и другими объектами словарей/сопоставлений нечувствительны к порядку, как и обычные словари. Это позволяет заменять объекты OrderedDict()
везде, где используется обычный словарь.
Новое в Python 3.6: для ключевых аргументов, передаваемых в конструктор OrderedDict()
и его метод .update()
сохраняется порядок их вставки.
Новое в Python 3.9: Добавлена поддержка операторов слияния словарей (|) и обновления словарей (|=).
collections.OrderedDict()
:Несложно создать вариант упорядоченного словаря, который запоминает последний порядок вставки ключей. Если новая запись перезаписывает существующую запись, исходная позиция вставки изменяется и перемещается в конец:
class LastUpdatedOrderedDict(OrderedDict): 'Store items in the order the keys were last added' def __setitem__(self, key, value): super().__setitem__(key, value) self.move_to_end(key)
OrderedDict()
также был бы полезен для реализации вариантов functools.lru_cache()
:
class LRU(OrderedDict): 'Limit size, evicting the least recently looked-up key when full' def __init__(self, maxsize=128, /, *args, **kwds): self.maxsize = maxsize super().__init__(*args, **kwds) def __getitem__(self, key): value = super().__getitem__(key) self.move_to_end(key) return value def __setitem__(self, key, value): if key in self: self.move_to_end(key) super().__setitem__(key, value) if len(self) > self.maxsize: oldest = next(iter(self)) del self[oldest]