Как the documentation говорит:
ключи и значения итерации в произвольном порядке, который не является случайным, различается по реализации Python, и зависит от истории словаря вставок и удалений.
Иными словами, словари не имеют неотъемлемого порядка. И вы можете видеть, что без всех сложных дополнений:
>>> print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
Если вы хотите Dict, который поддерживает свои ключи в порядке вставки, вы можете сделать это с OrderedDict
.
Однако этого недостаточно, чтобы помочь вам в этом случае. Если вы строите dict
(который имеет произвольный порядок), а затем передать, что к OrderedDict
, все, что вы делаете замерзает, что начальный произвольный порядок:
>>> from collections import OrderedDict
>>> print OrderedDict({'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1})
OrderedDict([('A', 1), ('c1', 0.5), ('gamma', 1), ('lambda', 1)])
repr
этого OrderedDict
должен дать вам ключ к тому, как вы можете создать OrderedDict
с заказом для начальных значений: создать его из последовательности, где каждый элемент является пары ключ-значение:
>>> print OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
Если вы хотите автоматически оживлять OrderedDict
, вы можете сделать это, используя OrderedDict
вместо dict
в существующем классе. Тем не менее, есть несколько проблем с классом, который вы используете, что вы, возможно, захотите рассмотреть. В частности, вы действительно хотите использовать super
вместо вызовов классического стиля в методах родительского класса; если бы вы сделали это, вы могли бы просто определить class AutoVivifiedOrderedDict(OrderedDict, AutoVivification): pass
и сделать это! Кроме того, я не думаю, что ваш класс будет правильно рассосаться как есть.
Если вы используете defaultdict
для autovivification, он уже позаботился о всех сложных битов:
def AutoVivification():
return defaultdict(AutoVivification)
Если после этого вы хотите добавить заказ к этому, вы будете нуждаться в OrderedDefaultDict
, так что вы может это сделать:
def OrderedAutoVivification():
return OrderedDefaultDict(AutoVivification)
Если вы не знаете, как создать OrderedDefaultDict
себя, искать рецепты. (Вы можете почти просто наследовать от обоих классов ... за исключением того факта, что у них разные подписи, поэтому вам нужно подумать о том, как должен выглядеть ваш __init__
и явно вызвать правильные инициализаторы базы с правильными аргументами. См. this question для некоторых обсуждение.)
Словари - это хэш-карты и не упорядочены. Если вам это нужно, вы можете использовать 'OrderedDict' из коллекций. – Hyperboreus
Кроме того, ваш текущий класс 'AutoVivification' является, по существу, вложенным' defaultdict', как в 'dd = lambda: defaultdict (dd)' ... – l4mpi
Все, что связано с авто-вивификацией, не имеет отношения к вопросу. Просто сделайте 'print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}', и вы увидите значения, упорядоченные точно так же. – abarnert