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


как правильно инициализировать упорядоченный словарь (OD), чтобы он сохранял порядок исходных данных?

from collections import OrderedDict

# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1}) 

# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])

# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])

вопрос:

  • будет OrderedDict сохранить порядок список кортежей, или кортеж кортежей кортежей или списков или список списков и т. д. передано во время инициализации (2-й и 3-й пример выше)?

  • как можно проверить, если OrderedDict на самом деле поддерживает порядок? Поскольку dict имеет непредсказуемый порядок, что делать, если мои тестовые векторы, к счастью, имеют тот же начальный порядок, что и непредсказуемый порядок диктатора? Например, если вместо d = OrderedDict({'b':2, 'a':1}) Я пишу d = OrderedDict({'a':1, 'b':2}), Я могу ошибочно заключить, что порядок сохраняется. В этом случае я узнал, что a dict упорядочен в алфавитном порядке, но это может быть не всегда верно. Каков надежный способ использовать контрпример для проверки того, сохраняет ли структура данных порядок или нет, за исключением многократных попыток тестовых векторов до одного перерывы?

П. С. Я просто оставлю это здесь ссылка: "конструктор OrderedDict и метод update () оба принимают аргументы ключевых слов, но их порядок теряется, потому что семантика вызова функции Python передает Аргументы ключевых слов с помощью обычного неупорядоченного словаря"

P. P. S: Надеюсь, в будущем OrderedDict также сохранит порядок кваргов (Пример 1):http://bugs.python.org/issue16991

2 77

2 ответа:

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

обратите внимание, что с помощью списка понимание в вашем последнем примере ничего не меняет. Нет никакой разницы между OrderedDict([(i,i) for i in l]) и OrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')]). Понимание списка оценивается и создает список, и он передается; OrderedDict ничего не знает о том, как он был создан.

# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b', 2), ('a', 1)])

Да, это будет работать. По определению, список всегда упорядочен так, как он представлен. Это касается и понимания списка, список генерируется таким же образом, как и данные (т. е. источник из списка будет детерминированным, полученным из set или dict не так много).

как можно проверить, если OrderedDict фактически поддерживает порядок. Поскольку дикт имеет непредсказуемый порядок, что делать, если мои тестовые векторы, к счастью, имеют то же самое начальный порядок как непредсказуемый порядок диктатора?. Например, если вместо d = OrderedDict({'b':2, 'a':1}) Я пишу d = OrderedDict({'a':1, 'b':2}), Я могу ошибочно заключить, что порядок сохраняется. В этом случае я узнал, что a dict это порядок в алфавитном порядке, но это может быть не всегда верно. т. е. каков надежный способ использовать пример счетчика, чтобы проверить, сохраняет ли структура данных порядок или не хватает многократных попыток тестовых векторов до тех пор, пока один не сломается.

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