Подтвердить что ты не робот

Правильный способ инициализации 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 сохранять порядок списка кортежей или кортежей кортежей или кортежей списков или списка списков и т.д., переданных во время инициализации (второй и третий пример выше)?

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

P.S. Я просто оставлю это здесь для ссылка: "Метод конструктора OrderedDict и update() принимают аргументы ключевого слова, но их порядок теряется, потому что Pythons функциональные вызовы semantics pass-in аргументы ключевого слова с использованием обычного неупорядоченного словаря"

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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