Есть ли применимые различия между dict.items()
и dict.iteritems()
?
Из документов Python :
dict.items()
Возвращает копию списка словаря пар (ключ, значение).
dict.iteritems()
Возвращает итератор для пар слов (ключ, значение).
Если я запускаю приведенный ниже код, кажется, что каждый возвращает ссылку на один и тот же объект. Есть ли тонкие различия, которые я пропускаю?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Вывод:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
items()
создает элементы сразу и возвращает список.iteritems()
возвращает генератор - генератор - это объект, который «создает» один элемент за раз каждый раз, когдаnext()
к нему обращаются.d[k] is v
всегда будет возвращать True, потому что python хранит массив целочисленных объектов для всех целых чисел от -5 до 256: docs.python.org/2/c-api/int.html Когда вы создаете int в этом диапазоне, вы на самом деле просто вернуть ссылку на существующий объект:>> a = 2; b = 2 >> a is b True
Но,>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
измененияiter()
в Python 3? Ссылка на документацию выше не соответствует этому ответу.Ответы:
Это часть эволюции.
Первоначально Python
items()
создал реальный список кортежей и вернул его. Это может занять много дополнительной памяти.Затем генераторы были введены в язык в целом, и этот метод был переопределен как метод итератор-генератор с именем
iteritems()
. Оригинал остается для обратной совместимости.Одно из изменений Python 3 состоит в том, что
items()
теперь возвращаются итераторы, а список никогда не создается полностью.iteritems()
Метод также нет, так какitems()
в Python 3 работает какviewitems()
в Python 2.7.источник
iteritems()
. Фактически он создает полный объект протокола последовательности, который также отражает изменения в dict (и поддерживается самим dict, а не избыточным списком) - он был перенесен в 2.7 asviewitems()
.iteritems()
всегда предпочтительнее, чемitems()
в Python 2.x?dict.items()
возвращает список 2-кортежей ([(key, value), (key, value), ...]
), тогдаdict.iteritems()
как это генератор, который выдает 2-кортежа. Первый занимает больше места и времени на начальном этапе, но доступ к каждому элементу происходит быстро, тогда как второй занимает меньше места и времени на начальном этапе, но немного больше времени при создании каждого элемента.источник
copy.deepcopy
). Это означает, что это копия элементов словаря: если вы сделаете,items = dct.items()
а затем изменитеdct
, добавив / удалив ключи илиdct[k] = other_v
,items
останетесь прежними.{1:'one', 2:'two', ... }
по которому я хочу перебрать веб-сервер и отобразить результаты. В каком масштабе я должен начать беспокоиться о выборе.items()
vs.iteritems()
для Python 2.7?В Py2.x
Команды
dict.items()
,dict.keys()
иdict.values()
возвращает копию из словаря список из(k, v)
пары, ключей и значений. Это может занять много памяти, если скопированный список очень большой.Команды
dict.iteritems()
,dict.iterkeys()
иdict.itervalues()
возвращает итератор над Словаре в(k, v)
пару, ключей и значений.Команды
dict.viewitems()
,dict.viewkeys()
иdict.viewvalues()
возвращают вид объекты , которые могут отражать изменения в словаре. (То есть, если выdel
добавляете элемент или добавляете(k,v)
пару в словарь, вид объекта может автоматически изменяться одновременно.)Пока в Py3.x
В Py3.x, все более чистые, так как есть только
dict.items()
,dict.keys()
иdict.values()
доступны, которые возвращают вид объекты так же , какdict.viewitems()
в сделал Py2.x.Но
Как заметил @lvc, объект представления не совпадает с итератором , поэтому, если вы хотите вернуть итератор в Py3.x, вы можете использовать
iter(dictview)
:источник
Вы спросили: «Существуют ли какие-либо применимые различия между dict.items () и dict.iteritems ()»
Это может помочь (для Python 2.x):
Вы можете видеть, что
d.items()
возвращает список кортежей ключа, пары значений иd.iteritems()
возвращает словарь-элементитератор.Как список, d.items () может работать с фрагментами:
Но не было бы
__iter__
метода:Как итератор, d.iteritems () не может работать с секциями :
Но имеет
__iter__
:Таким образом, сами предметы одинаковы - контейнер для доставки предметов различен. Один - список, другой - итератор (в зависимости от версии Python ...)
Таким образом, применимые различия между dict.items () и dict.iteritems () такие же, как применимые различия между списком и итератором.
источник
dict.items()
вернуть список кортежей иdict.iteritems()
вернуть объект итератора кортежа в словарь как(key,value)
. Кортежи одинаковые, но контейнер другой.dict.items()
в основном копирует весь словарь в список. Попробуйте использовать следующий код, чтобы сравнить время выполненияdict.items()
иdict.iteritems()
. Вы увидите разницу.Выход в моей машине:
Это ясно показывает, что
dictionary.iteritems()
это гораздо эффективнее.источник
Если у тебя есть
dict = {key1:value1, key2:value2, key3:value3,...}
В Python 2 ,
dict.items()
копирует каждый кортежи и возвращает список кортежей в словаре т.е.[(key1,value1), (key2,value2), ...]
. Это означает, что весь словарь копируется в новый список, содержащий кортежиdict.iteritems()
возвращает итератор элемента словаря Значение возвращаемого элемента также то же самое, т.(key1,value1), (key2,value2), ...
Е. Это не список. Это всего лишь объект итератора элемента словаря. Это означает меньшее использование памяти (на 50% меньше).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Кортежи одинаковы. Вы сравнили кортежи в каждом, так что вы получите то же самое.
В Python 3 ,
dict.items()
возвращает итератор объекта. dict.iteritems () удален, поэтому больше нет проблем.источник
dict.iteritems
отсутствует в Python3.x Так что используйте,iter(dict.items())
чтобы получить тот же вывод и распределение памятиисточник
Если вам нужен способ итерации пар элементов словаря, который работает с Python 2 и 3, попробуйте что-то вроде этого:
Используйте это так:
источник
dict.iteritems()
: дает вам итератор. Вы можете использовать итератор в других шаблонах вне цикла.источник
dict.iteritems () в python 2 эквивалентен dict.items () в python 3.
источник