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

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

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

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

for k, v in dic:
    print k, v

Ответ 1

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

for item in C:
    assert item in C

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

Итак, когда C является словарем, если in должен был давать кепки key/value в цикле 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 было оригинальным написанием "правильных" методов использования для получения пар ключ/значение: к сожалению, это было в те дни, когда такие аксессоры возвращали целые списки, поэтому для поддержки "просто повторения" альтернативная орфография была и iteritems было - в Python 3, где ограничения обратной совместимости с предыдущими версиями Python были значительно ослаблены, он снова стал items).

Ответ 2

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

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

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

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

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