Словник Python: чи клавіші () та значення () завжди однакові?


312

Схоже, що списки, повернені в списку, keys()і values()методи словника завжди є зіставленням 1 на 1 (якщо припустити, що словник не змінюється між викликом двох методів).

Наприклад:

>>> 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(), помилково вважати, що вищевказаний формат циклу завжди друкує True? Я не зміг знайти жодної документації, яка б це підтверджувала.


1
У CPython 3.7 (і вище, мабуть) ви можете покластися на порядок ітерації словника, що відповідає порядку вставки. mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen

@BallpointBen - це в CPython 3.6 і новіших версіях, а також у всіх інших реалізаціях Python, починаючи з Python 3.7
Борис

Відповіді:


353

Знайшов це:

Якщо items(), keys(), values(), iteritems(), iterkeys(), і itervalues()називаються без проміжних модифікацій в словник, списки будуть безпосередньо відповідати.

На 2.x документації та 3.x документації .


5
мабуть, твердження в документації 3.x чіткіше: "порядок предметів буде безпосередньо відповідати"
Шаохуа Лі

4
Цей текст відсутній у документації 3.7. Я можу припустити лише тому, що "Dict зберігає порядок вставки" в 3.7: mail.python.org/pipermail/python-dev/2017-December/151283.html
EliadL

80

Так, те, що ви спостерігали, - це справді гарантоване властивість - списки повернення ключів (), значень () та елементів () у конгруентному порядку, якщо dict не буде змінено. iterkeys () & c також повторюють у тому ж порядку, що і відповідні списки.


1
Однак, в разі , якщо список буде змінений, панди dataframeпропонує альтернативу , де елементи можуть бути оновлені або видалені, а також порядок і розташування індексів з елементів в Словнику-подібної структури залишаються незмінними.
Віль

48

Так, це гарантовано в python 2.x :

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



6

Гарні посилання на документи. Ось як можна гарантувати замовлення незалежно від документації / реалізації:

k, v = zip(*d.iteritems())

1
У python3.x використовуйте dict.items ()
Добрий Воля

4

Відповідно до http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , метод ключів (), значень () та елементів () dict поверне відповідні ітератори, накази яких відповідають. Однак я не можу знайти посилання на офіційну документацію для python 2.x для того ж самого.

Наскільки я можу сказати, відповідь "так", але тільки в python 3.0+


4

Оскільки це вартий, якийсь важко використаний виробничий код, який я написав, ґрунтується на цьому припущенні, і у мене ніколи не було проблем з цим. Я знаю, що це не робить правдою :-)

Якщо ви не хочете ризикувати, я б скористався iteritems (), якщо можете.

for key, value in myDictionary.iteritems():
    print key, value

-2

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

Тут ви вказуєте наперед ключовий порядок, повернені значення завжди матимуть однаковий порядок, навіть якщо dict змінюється, або ви використовуєте інший dict.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.