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

Why is python ordering my dictionary like so? [duplicate]

Почему python упорядочивает мой словарь именно так?

Вот словарь, который у меня есть

propertyList = {
"id": "int",
"name": "char(40)",

"team": "int",
"realOwner": "int",

"x": "int",
"y": "int",

"description": "char(255)",

"port": "bool",
"secret": "bool",
"dead": "bool",
"nomadic": "bool",

"population": "int",
"slaves": "int",
}

Но когда я распечатываю его с помощью "\n".join (myDict), я получаю это

name
nomadic
dead
port
realOwner
secret
slaves
team
y
x
population
id
description

Я знаю, что словарь неупорядочен, но каждый раз получается одно и то же, и я понятия не имею почему.

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

Для более старых версий Python реальный вопрос должен быть “почему нет?” — Неупорядоченный словарь обычно реализуется в виде хэш-таблицы, где порядок элементов четко определен, но не сразу очевиден (документация Python, используемая для указания этого). Ваши наблюдения идеально соответствуют правилам хэш-таблицы: кажущийся произвольным, но постоянный порядок.

С тех пор Python изменил свою dict реализацию, чтобы сохранить порядок вставки, и это гарантировано начиная с Python 3.7. Таким образом, реализация больше не представляет собой чистую хэш-таблицу (но хэш-таблица все еще используется в ее реализации).

Ответ 2

Спецификация для типа встроенного словаря исключает какое-либо сохранение порядка, лучше всего думать о словаре как о неупорядоченном наборе key: value пар...

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

Ответ 3

Единственное, на что вы можете положиться в упорядочении словарей, это то, что порядок останется прежним, если в словарь не будут внесены изменения; например, повторение словаря дважды без его изменения приведет к той же последовательности ключей. Однако, хотя порядок словарей Python детерминирован, на него могут влиять такие факторы, как порядок вставок и удалений, поэтому одинаковые словари могут иметь разный порядок:

>>> {1: 0, 2: 0}, {2: 0, 1: 0}
({1: 0, 2: 0}, {1: 0, 2: 0})
>>> {1: 0, 9: 0}, {9: 0, 1: 0}
({1: 0, 9: 0}, {9: 0, 1: 0})
python dictionary