Похоже, что списки, возвращаемые keys()
и values()
методы словаря, всегда являются отображением 1: 1 (при условии, что словарь не изменяется между вызовами 2 методов).
Например:
>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
print d[k[i]] == v[i]
True
True
True
Если вы не измените словарь между вызовом keys()
и вызовом values()
, неправильно ли считать, что приведенный выше цикл for всегда будет печатать True? Я не смог найти никаких документов, подтверждающих это.
Ответы:
Нашел это:
На 2.x документации и 3.x документации .
источник
Да, то, что вы заметили, действительно является гарантированным свойством - keys (), values () и items () возвращают списки в согласованном порядке, если dict не изменяется. iterkeys () & c также выполняет итерацию в том же порядке, что и соответствующие списки.
источник
dataframe
предлагает альтернативу , где элементы могут быть обновлены или удалены, а также порядок и расположения индексов из элементов в Словаре-подобной структуры остаются неизменными.Да, это гарантировано в Python 2.x :
источник
Да. Начиная с CPython 3.6, словари возвращают элементы в том порядке, в котором вы их вставили .
Проигнорируйте часть, которая говорит, что это деталь реализации. Это поведение гарантировано в CPython 3.6 и требуется для всех других реализаций Python, начиная с Python 3.7 .
источник
Хорошие ссылки на документы. Вот как вы можете гарантировать заказ независимо от документации / реализации:
источник
Согласно http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , методы dict keys (), values () и items () будут возвращать соответствующие итераторы, чьи порядки соответствовать. Тем не менее, я не могу найти ссылку на официальную документацию для Python 2.x по той же причине.
Так что, насколько я могу судить, ответ да, но только в Python 3.0+
источник
Что бы это ни стоило, некоторый интенсивно используемый производственный код, который я написал, основан на этом предположении, и у меня никогда не было проблем с ним. Я знаю, что это не делает это правда :-)
Если вы не хотите рисковать, я бы использовал iteritems (), если вы можете.
источник
Я не был удовлетворен этими ответами, так как хотел, чтобы экспортированные значения имели одинаковый порядок, даже при использовании разных диктов.
Здесь вы указываете порядок ключей заранее, возвращаемые значения всегда будут иметь один и тот же порядок, даже если диктат изменяется, или вы используете другой диктат.
источник