Пропустить до содержимого

Как использовать ordereddict в Python?

[

OrderedDict vs dict в Python: правильный инструмент для работы

Время от времени вам может понадобиться словарь в Python, который запоминает порядок своих элементов. В прошлом у вас был только один инструмент для решения этой конкретной задачи: OrderedDict в Python. Это специальный класс-наследник словаря, специально разработанный для запоминания порядка элементов, который определяется порядком вставки ключей.

В Python 3.6 это изменилось. Встроенный класс dict теперь также сохраняет порядок своих элементов. Из-за этого многие в сообществе Python задаются вопросом, все еще ли полезен OrderedDict. Более детальное рассмотрение OrderedDict позволит обнаружить, что этот класс по-прежнему обладает ценными функциями.

В этом учебнике вы узнаете, как:

  • Создавать и использовать объекты OrderedDict в своем коде
  • Определить отличия между OrderedDict и dict
  • Понять достоинства и недостатки использования OrderedDict по сравнению с dict

Получив эти знания, вы сможете выбрать класс словаря, который лучше всего подходит для ваших потребностей, когда вы хотите сохранить порядок элементов.

По окончании учебника вы увидите пример реализации словаря-очереди на основе OrderedDict, что было бы более сложно, если бы вы использовали обычный объект dict.

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

Выбор между OrderedDict и dict

В 2008 году была предложена PEP 372, которая вводит идею о добавлении нового класса словаря в collections. Его основная цель заключалась в запоминании порядка элементов, определяемого порядком вставки ключей. Именно так появился OrderedDict.

Разработчики Python хотели заполнить пробел и предоставить словарь, который мог бы сохранить порядок вставки ключей. Это, в свою очередь, позволило более простую реализацию упорядоченных словарей.

Если вы хотите создать OrderedDict, то вам следует использовать следующий синтаксис:

from collections import OrderedDict
# Создание объекта OrderedDict
d = OrderedDict()
# Добавление элементов в OrderedDict
d["key1"] = "value1"
d["key2"] = "value2"

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

Однако, если вы хотите создать обычный словарь (dict) и убедиться, что элементы будут сохраняться по порядку, вам следует использовать версию Python 3.7 и выше, где встроенному классу dict добавили поддержку сохранения порядка элементов:

# Создание обычного словаря сохранением порядка элементов
d = {}
# Добавление элементов в словарь
d["key1"] = "value1"
d["key2"] = "value2"

Этот код также будет сохранять порядок элементов при использовании последних версий Python.

OrderedDict в Python: начало работы

Теперь, когда вы знаете различия между OrderedDict и dict, давайте начнем работу с OrderedDict. В этом разделе вы узнаете, как создавать объекты OrderedDict, управлять элементами в OrderedDict и выполнять операции итерации по OrderedDict в различных порядках.

Создание объектов OrderedDict

Создание OrderedDict - это простой процесс. Вам просто нужно импортировать класс OrderedDict из модуля collections и создать экземпляр класса:

from collections import OrderedDict
# Создание объекта OrderedDict
d = OrderedDict()

Вы можете создать пустой OrderedDict или же передать его начальным элементам:

# Создание объекта OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])

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

Управление элементами в OrderedDict

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

Добавление элементов

from collections import OrderedDict
# Создание пустого OrderedDict
d = OrderedDict()
# Добавление элементов в OrderedDict
d["key1"] = "value1"
d["key2"] = "value2"

Определение итеративного порядка

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Изменение порядка элементов в OrderedDict
d.move_to_end("key1") # Перемещение элемента в конец
d.move_to_end("key2", last=False) # Перемещение элемента в начало

Удаление элементов

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Удаление элемента из OrderedDict
d.pop("key1")

Объединение и обновление словарей с помощью операторов

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d1 = OrderedDict([
("key1", "value1"),
("key2", "value2")
])
d2 = OrderedDict([
("key3", "value3")
])
# Объединение двух OrderedDict
d = OrderedDict(list(d1.items()) + list(d2.items()))
# Обновление одного OrderedDict с помощью другого OrderedDict
d1.update(d2)

Итерация по элементам OrderedDict

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Итерация по ключам и значениям OrderedDict
for key, value in d.items():
print(key, value)

Итерация в обратном порядке с помощью reversed()

OrderedDict также предоставляет возможность итерации по элементам в обратном порядке с помощью функции reversed(). Вот пример:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Итерация по ключам и значениям OrderedDict в обратном порядке
for key, value in reversed(d.items()):
print(key, value)

Исследование уникальных возможностей OrderedDict в Python

OrderedDict предлагает несколько уникальных возможностей, которые помогают вам манипулировать словарями, сохраняя при этом порядок элементов. Рассмотрим некоторые из них:

Изменение порядка элементов с помощью .move_to_end()

Метод .move_to_end() позволяет изменить порядок элементов в OrderedDict, перемещая заданный ключ в начало или конец словаря. Вот пример:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Изменение порядка элементов: перемещение элемента в конец
d.move_to_end("key1")
print(d)

В результате этого кода элемент с ключом “key1” будет перемещен в конец словаря:

OrderedDict([('key2', 'value2'), ('key3', 'value3'), ('key1', 'value1')])

Метод .move_to_end() принимает опциональный аргумент last, который указывает, должен ли элемент перемещаться в конец (если значение True) или в начало (если значение False). По умолчанию элемент перемещается в конец, если аргумент не указан.

Удаление элементов с помощью .popitem()

Метод .popitem() позволяет удалить элемент из OrderedDict. Он удаляет и возвращает последний элемент, добавленный в OrderedDict (в соответствии с текущим порядком элементов). Вот пример:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2"),
("key3", "value3")
])
# Удаление элемента из OrderedDict
key, value = d.popitem()
print(key, value)
print(d)

По завершении этого кода последний элемент, добавленный в OrderedDict, будет удален и возвращен, а сам OrderedDict будет выглядеть так:

key3 value3
OrderedDict([('key1', 'value1'), ('key2', 'value2')])

Тестирование равенства между словарями

OrderedDict поддерживает операторы сравнения, такие как == и !=, которые позволяют сравнивать равенство словарей. При сравнении равенство учитывает порядок элементов. Вот пример:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d1 = OrderedDict([
("key1", "value1"),
("key2", "value2")
])
d2 = OrderedDict([
("key2", "value2"),
("key1", "value1")
])
# Сравнение равенства между двумя OrderedDict
print(d1 == d2) # Вывод: False

В этом примере d1 и d2 содержат одни и те же элементы, но в разном порядке. Это делает их не равными при сравнении.

Добавление новых атрибутов к экземпляру словаря

OrderedDict позволяет добавлять новые атрибуты к экземпляру. Это может быть полезно, если вам нужно добавить дополнительную информацию к словарю. Вот пример:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d = OrderedDict([
("key1", "value1"),
("key2", "value2")
])
# Добавление нового атрибута к экземпляру словаря
d.new_attribute = "new_value"
print(d)

В результате этого кода в OrderedDict будет добавлен новый атрибут new_attribute со значением "new_value":

OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('new_attribute', 'new_value')])

Слияние и обновление словарей с помощью операторов

OrderedDict также поддерживает операторы для объединения и обновления словарей. Это может быть полезным при работе с несколькими словарями и объединении их элементов. Вот примеры использования этих операторов:

from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d1 = OrderedDict([
("key1", "value1"),
("key2", "value2")
])
d2 = OrderedDict([
("key3", "value3")
])
# Объединение двух OrderedDict
d = OrderedDict(list(d1.items()) + list(d2.items()))
print(d)

В результате этого кода элементы обоих OrderedDict будут объединены в один:

OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
from collections import OrderedDict
# Создание OrderedDict с начальными элементами
d1 = OrderedDict([
("key1", "value1"),
("key2", "value2")
])
d2 = OrderedDict([
("key3", "value3")
])
# Обновление одного OrderedDict с помощью другого OrderedDict
d1.update(d2)
print(d1)

В результате этого кода элементы d2 будут добавлены в d1:

OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])

Выбор правильного словаря для работы

Рассмотрев различия между OrderedDict и dict, а также узнав о возможностях OrderedDict, вы можете принять обоснованное решение о выборе словаря, наиболее подходящего для ваших потребностей. Если вам важно сохранить порядок элементов, используйте OrderedDict. Если же порядок не имеет значения, а вам нужна максимальная производительность, dict может быть лучшим выбором.

Построение queue на основе словаря

С помощью OrderedDict вы можете легко реализовать queue на основе словаря. Queue - это структура данных, которая работает по принципу “первый пришел - первый обслужен” (FIFO). Вот пример реализации queue на основе OrderedDict:

from collections import OrderedDict
class Queue:
def __init__(self):
self.queue = OrderedDict()
def enqueue(self, item):
self.queue[item] = None
def dequeue(self):
return self.queue.popitem(last=False)[0]
def is_empty(self):
return len(self.queue) == 0
def size(self):
return len(self.queue)
# Создание очереди на основе OrderedDict
q = Queue()
# Добавление элементов в очередь
q.enqueue("item1")
q.enqueue("item2")
q.enqueue("item3")
# Вывод элементов в очереди в порядке добавления
while not q.is_empty():
item = q.dequeue()
print(item)

Здесь очередь реализуется с использованием OrderedDict. Метод enqueue() добавляет элемент в очередь (в конец OrderedDict), метод dequeue() удаляет и возвращает элемент из очереди (из начала OrderedDict), метод is_empty() проверяет, пуста ли очередь, а метод size() возвращает размер очереди.

Вся концепция queue основана на сохранении порядка элементов. Без OrderedDict было бы сложнее реализовать queue в такой простой и эффективной форме.

Заключение

В этом учебнике вы узнали о различиях между OrderedDict и dict в Python и увидели примеры использования OrderedDict для сохранения порядка элементов. Теперь вы можете принять обоснованное решение о том, какой словарь использовать в различных ситуациях.

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

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