Почему вы должны вызывать .iteritems () при итерации по словарю в python?

Почему вы должны вызывать iteritems() для итерации по парам ключей, значений в словаре? т.е.

 dic = {'one':'1', 'two':'2'} for k, v in dic.iteritems(): print k, v 

Почему это не так, что поведение по итерации по словарю по умолчанию

  • Как подсчитать уникальные значения внутри массива в Python?
  • Модификация элементов списка в цикле (python)
  • Петля, пока пользовательский ввод
  • Печать при нажатии мыши
  • В чем разница между функциями range и xrange в Python 2.X?
  • Поиск второго наименьшего числа с использованием циклов в python
  •  for k, v in dic: print k, v 

  • Как я могу реализовать dict с абстрактными базовыми классами в Python?
  • Использование словаря Python в качестве ключа (не вложенного)
  • Преобразование списка python в словарь
  • Почему 008 и 009 недействительные ключи для Python dicts?
  • Чтение файла в словарь и подсчет количества записей
  • Проверить вложенные значения словаря?
  • 2 Solutions collect form web for “Почему вы должны вызывать .iteritems () при итерации по словарю в python?”

    Для каждого контейнера C питона C ожидается, что

     for item in C: assert item in C 

    пройдет очень хорошо – разве вы не удивитесь, если бы одно чувство (предложение цикла) имело совершенно другое значение от другого (проверка присутствия)? Я бы точно! Естественно, это работает для списков, наборов, кортежей, …

    Итак, когда C является словарем, если бы in были уроки с ключом / значением в цикле for , то, по принципу наименьшего удивления, in также пришлось бы взять такой кортеж, как его левый операнд в проверке сдерживания ,

    Насколько это полезно? Довольно бесполезно, в основном, if (key, value) in C синоним, if C.get(key) == value – это проверка, которую, я считаю, я мог выполнить или хотел выполнить в 100 раз реже, чем что, if k in C самом деле означает , проверяя наличие только ключа и полностью игнорируя значение.

    С другой стороны, очень хочется, чтобы петля на клавишах была довольно распространена, например:

     for k in thedict: thedict[k] += 1 

    не имея значения, особо не помогло бы:

     for k, v in thedict.items(): thedict[k] = v + 1 

    на самом деле несколько менее ясным и менее кратким. (Обратите внимание, что items были оригинальным написанием «правильных» методов, используемых для получения пар ключ / значение: к сожалению, это было в те дни, когда такие аксессоры возвращали целые списки, поэтому для поддержки «просто повторения» альтернативное правописание должно было быть и это было – в Python 3, где ограничения обратной совместимости с предыдущими версиями Python были значительно ослаблены, они снова стали items ).

    Мое предположение: использование полного кортежа было бы более интуитивно понятным для цикла, но, возможно, и менее для тестирования членства с использованием.

     if key in counts: counts[key] += 1 else: counts[key] = 1 

    Этот код не работает, если вам нужно указать как ключ, так и значение для. Мне сложно представить пример использования, в котором вы бы указали, есть ли ключ и значение в словаре. Гораздо более естественно проверять ключи.

     # When would you ever write a condition like this? if (key, value) in dict: 

    Теперь нет необходимости, чтобы оператор и for ... in работали над одними и теми же элементами. Реализация – это разные операции ( __contains__ vs. __iter__ ). Но эта небольшая несогласованность будет несколько запутанной и, ну, непоследовательной.

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