Словарь Python: есть ключи () и values ​​() всегда одинаковый порядок?

Похоже, что списки, возвращаемые методами 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() , неправильно ли предположить, что вышеуказанный for-loop всегда будет печатать True? Я не мог найти документацию, подтверждающую это.

  • Как остановить PyCharm от заселения docstrings?
  • Программирование учебников для людей с нулевым опытом
  • Как проверить, входит ли один из следующих элементов в список?
  • Python находит n последовательных номеров в списке
  • числа треугольников в python
  • Копировать Python через назначение?
  • Как преобразовать время в строку
  • В чем разница между globals (), locals () и vars ()?
  • 7 Solutions collect form web for “Словарь Python: есть ключи () и values ​​() всегда одинаковый порядок?”

    Найдено:

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

    Документация 2.x и документация 3.x.

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

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

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

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

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

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

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

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

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

    Здесь вы указываете приоритет заказа ключа, возвращаемые значения всегда будут иметь тот же порядок, даже если изменяется 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] 

    Как уже отмечалось, да, многие практические применения были бы обеими обеими.

     zip(d.keys(), d.values()) 

    Поскольку порядок доступа остается таким же, хотя и не предсказуемым, это всегда будет возвращать тот же (ключ, значение) кортеж.

    Interesting Posts

    используя win32com.client в python, как найти и заменить несколько текстов

    Отправка электронной почты от имени пользователя Google Apps

    Чтение значения ячейки Excel, а не формулы, вычисляющей его -openpyxl

    Динамическое изменение размера и добавление виджетов в окно Tkinter

    Отображение Pandas Dataframe на веб-странице

    Как найти текстовое описание смайликов, символов Unicode и emoji в строке (python, perl)?

    Самый простой способ сжимать в Python и распаковывать с помощью распаковки C # (и наоборот)

    Сериализуемые объекты Python json

    Удалить элемент в списке с помощью цикла for-loop

    Проблема с python: _winreg

    Python – способ рекурсивного поиска и замены строки в текстовых файлах

    Есть ли способ получить argparse.ArgumentParser.parse_args (), чтобы не выходить из аргументов?

    Как управлять файлами wav-файлов в Python?

    Как прекратить получение ImportError: не удалось импортировать настройки «mofin.settings» при использовании django с wsgi?

    Как заставить окно Tkinter перейти на передний план?

    Python - лучший язык программирования в мире.