Каков правильный способ инициализации упорядоченного словаря (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
заказ? Так как adict
имеет непредсказуемый порядок, что, если мои тестовые векторы, к счастью, имеют тот же начальный порядок, что и непредсказуемый порядок dict? Например, если вместоd = OrderedDict({'b':2, 'a':1})
пишуd = OrderedDict({'a':1, 'b':2})
, я ошибочно могу заключить, что порядок сохранен. В этом случае я обнаружил, что adict
упорядочен по алфавиту, но это может быть не всегда верно. Какой надежный способ использовать контрпример для проверки того, сохраняет ли структура данных порядок или нет, не дотягивая тестовые векторы до тех пор, пока не разобьется?
P.S. Я просто оставлю это здесь для ссылка: "Метод конструктора OrderedDict и update() принимают аргументы ключевого слова, но их порядок теряется, потому что Pythons функциональные вызовы semantics pass-in аргументы ключевого слова с использованием обычного неупорядоченного словаря"
P.P.S: Надеюсь, в будущем OrderedDict сохранит также порядок kwargs (пример 1): http://bugs.python.org/issue16991