Сообщить об ошибке.

Класс OrderedDict() модуля collections в Python

Обеспечивает частые операции переупорядочения ключей словаря

Синтаксис:

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() для эффективного перемещения элемента в конечную точку.
  • До Python 3.8 в обычных словарях 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]