Вопрос-Ответ

How to keep keys/values in same order as declared?

Как сохранить ключи / значения в том же порядке, что и объявлено?

У меня есть словарь, который я объявил в определенном порядке, и я хочу постоянно сохранять его в этом порядке. Ключи / значения на самом деле нельзя сохранить в порядке, основанном на их значении, я просто хочу, чтобы они были в том порядке, в котором я их объявил.

Итак, если у меня есть словарь:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

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

Переведено автоматически
Ответ 1

Начиная с Python 3.6, стандартный dict тип поддерживает порядок вставки по умолчанию.

Определение

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

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

Это было достигнуто за счет использования простого массива с целыми числами для разреженной хэш-таблицы, где эти целые числа индексируются в другой массив, в котором хранятся пары ключ-значение (плюс вычисленный хэш). Этот последний массив просто хранит элементы в порядке вставки, и вся комбинация фактически использует меньше памяти, чем реализация, используемая в Python 3.5 и ранее. Подробнее смотрите Сообщение об оригинальной идее Раймонда Хеттингера.

В версии 3.6 это все еще считалось детализацией реализации; смотрите Что нового в Python 3.6 документация:


Аспект сохранения порядка в этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно иметь эту новую реализацию dict в языке для нескольких выпусков, прежде чем изменять спецификацию языка, чтобы обеспечить сохранение порядка семантики для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где все еще действует случайный порядок итераций, например, Python 3.5).


Python 3.7 поднимает эту деталь реализации до языковой спецификации, поэтому теперь обязательно, чтобы dict сохранялся порядок во всех реализациях Python, совместимых с этой версией или новее. Смотрите Заявление BDFL. Начиная с версии Python 3.8, словари также поддерживают итерацию в обратном порядке.

Вы все равно можете захотеть использовать collections.OrderedDict() класс в определенных случаях, поскольку он предлагает некоторую дополнительную функциональность поверх стандартного dict типа. Например, будучи обратимым (это распространяется на объекты просмотра) и поддерживая изменение порядка (с помощью move_to_end() метода).

Ответ 2
from collections import OrderedDict
OrderedDict((word, True) for word in words)

содержит

OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])

Если значения True (или любой другой неизменяемый объект), вы также можете использовать:

OrderedDict.fromkeys(words, True)
Ответ 3

Rather than explaining the theoretical part, I'll give a simple example.

>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}
Ответ 4

Note that this answer applies to python versions prior to python3.7. CPython 3.6 maintains insertion order under most circumstances as an implementation detail. Starting from Python3.7 onward, it has been declared that implementations MUST maintain insertion order to be compliant.


python dictionaries are unordered. If you want an ordered dictionary, try collections.OrderedDict.

Note that OrderedDict was introduced into the standard library in python 2.7. If you have an older version of python, you can find recipes for ordered dictionaries on ActiveState.

2023-07-03 15:23 python dictionary