iteritems в Python
законно ли использовать items() вместо iteritems() во всех местах? Почему было iteritems() удалено из Python 3? Кажется, это потрясающий и полезный метод. Что за причина этого?
EDIT: чтобы уточнить, я хочу знать, какая правильная идиома для итерации по словарю в генераторном виде (по одному элементу за раз, а не все в память) таким образом, который совместим как с Python 2, так и с Python 3?
6 ответов:
В Python 2.x -
.items()возвращает список пар (ключ, значение). В Python 3.x,.items()теперьitemviewобъект, который ведет себя по-другому - так это и для повторения или материализации... Итак,list(dict.items())необходима для того, что былоdict.items()в Python 2.x.Python 2.7 также имеет немного заднего порта для обработки ключей, в котором у вас есть
viewkeys,viewitemsиviewvaluesметоды, наиболее полезные из которыхviewkeys, который ведет себя больше какset(чего и следовало ожидать отdict).простой пример:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())даст вам список общих ключей, но, опять же, в Python 3.х - просто используйте
.keys()вместо.Python 3.x обычно был сделан более "ленивым" - т. е.
mapэффективноitertools.imap,zipиitertools.izip, так далее.
dict.iteritemsбыл удален из-заdict.itemsтеперь делает вещьdict.iteritemsсделал в python 2.X и даже улучшил его немного, сделав егоitemview.
шести библиотека помогает с написанием кода, совместимого с python 2.5+ и python 3. Он имеет метод iteritems, который будет работать как в python 2, так и в 3. Пример:
from __future__ import division, absolute_import, print_function, unicode_literals import six d = dict( foo=1, bar=2 ) for k, v in six.iteritems(d): print(k, v)
как словарь документации для python 2 и python 3 сказал бы вам, в python 2
itemsвозвращает список, в то время какiteritemsвозвращает итератор.в python 3,
itemsвозвращает a view, что в значительной степени совпадает с итератором.если вы используете python 2, Вы можете использовать
iteritemsЕсли вы имеете дело с большими словарями, и все вы хотите сделать, это перебрать элементы (не обязательно копировать их к списку)
вы не можете использовать
itemsвместоiteritemsво всех местах в Python. Например, следующий код:class C: def __init__(self, a): self.a = a def __iter__(self): return self.a.iteritems() >>> c = C(dict(a=1, b=2, c=3)) >>> [v for v in c] [('a', 1), ('c', 3), ('b', 2)]сломается, если вы используете
items:class D: def __init__(self, a): self.a = a def __iter__(self): return self.a.items() >>> d = D(dict(a=1, b=2, c=3)) >>> [v for v in d] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __iter__ returned non-iterator of type 'list'то же самое верно для viewitems, который доступен в Python 3.
также, так как предметы возвращает копию списка словаря
(key, value)пары, это менее эффективно, если вы не хотите создать копию в любом случае.в Python 2, это лучший использовать
iteritemsдля итерации. Элемент2to3инструмент может заменить его наitemsЕсли вы когда-нибудь решите перейти на Python 3.
как и заметил @Wessie,
dict.iteritems,dict.iterkeysиdict.itervalues(который возвращает итератор в Вместо python2.х), а такжеdict.viewitems,dict.viewkeysиdict.viewvalues(взамен посмотреть объекты в Вместо python2.x) все были удалены в Python3.xи
dict.items,dict.keysиdict.valuesвозвращает скопировать из списка словаря в Python2.x теперь верните посмотреть объекты в Python3.x,но они все еще не то же самое, что итератор.если вы хотите возвратить итератор в Python3.x, Используйте
iter(dictview):$ python3.3 >>> d = {'one':'1', 'two':'2'} >>> type(d.items()) <class 'dict_items'> >>> >>> type(d.keys()) <class 'dict_keys'> >>> >>> >>> ii = iter(d.items()) >>> type(ii) <class 'dict_itemiterator'> >>> >>> ik = iter(d.keys()) >>> type(ik) <class 'dict_keyiterator'>
Comments