Словарь Python: ключи () и значения () всегда одинакового порядка? - PullRequest
266 голосов
/ 07 мая 2009

Похоже, что списки, возвращаемые методами 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? Я не смог найти никаких документов, подтверждающих это.

Ответы [ 8 ]

305 голосов
/ 07 мая 2009

Нашел это:

Если items(), keys(), values(), iteritems(), iterkeys() и itervalues() называются без промежуточные изменения в словарь, списки будут напрямую соответствует.

В 2.х документации и 3.х документации .

76 голосов
/ 07 мая 2009

Да, то, что вы заметили, действительно является гарантированным свойством - keys (), values ​​() и items () возвращают списки в согласованном порядке, если dict не изменяется. iterkeys () & c также выполняет итерацию в том же порядке, что и соответствующие списки.

45 голосов
/ 07 мая 2009

Да, это гарантировано в Python 2.x :

Если представления ключей, значений и элементов повторяются без вмешательства внесение изменений в словарь, порядок пунктов будет напрямую соответствует.

4 голосов
/ 07 мая 2009

Для чего бы то ни было, некоторый интенсивно используемый производственный код, который я написал, основан на этом предположении, и у меня никогда не было проблем с ним. Я знаю, что это не делает это правда: -)

Если вы не хотите рисковать, я бы использовал iteritems (), если вы можете.

for key, value in myDictionary.iteritems():
    print key, value
4 голосов
/ 07 мая 2009

Согласно http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects, методы dict keys (), values ​​() и items () будут возвращать соответствующие итераторы, чьи порядки соответствуют. Тем не менее, я не могу найти ссылку на официальную документацию для Python 2.x для того же.

Так что, насколько я могу судить, ответ - да, но только в python 3.0 +

3 голосов
/ 25 июня 2018

Хорошие ссылки на документы. Вот как вы можете гарантировать заказ независимо от документации / реализации:

k, v = zip(*d.iteritems())
3 голосов
/ 16 декабря 2017

Да. Начиная с CPython 3.6, словари возвращают элементы в том порядке, в котором вы их вставили .

Игнорировать часть, которая говорит, что это деталь реализации. Это поведение гарантировано в CPython 3.6 и требуется для всех других реализаций Python начиная с Python 3.7 .

0 голосов
/ 12 июля 2017

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

Здесь вы указываете порядок ключей заранее, возвращаемые значения всегда будут иметь одинаковый порядок, даже если диктат изменяется или вы используете другой диктат.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...