iteritems в Python



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



EDIT: чтобы уточнить, я хочу знать, какая правильная идиома для итерации по словарю в генераторном виде (по одному элементу за раз, а не все в память) таким образом, который совместим как с Python 2, так и с Python 3?

696   6  

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

    Ничего не найдено.