Коли слід використовувати iteritems () замість елементів ()?


153

Чи законно використовувати items()замість iteritems()усіх місць? Чому його iteritems()видалили з Python 3? Схоже, приголомшливий і корисний метод. Які міркування за цим?

Редагувати: Щоб уточнити, я хочу знати, що є правильною фразовою фразою для повторення словника таким чином, як генератор (один елемент за часом, не все в пам'ять) таким чином, що сумісний як з Python 2, так і з Python 3 ?

Відповіді:


148

У 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.x - просто використовуйте .keys()замість цього.

Python 3.x, як правило, був більш "ледачим" - тобто mapзараз ефективно itertools.imap, zipє itertools.izipі т.д.


96

dict.iteritemsбуло видалено, тому що dict.itemsтепер це dict.iteritemsробилося в python 2.x і навіть трохи покращило його, зробивши його itemview.


64

Шість бібліотеки допомагають писати код, сумісний як з python 2.5+, так і з python 3. У ньому є метод iteritems, який буде працювати як в python 2, так і в 3. Приклад:

import six

d = dict( foo=1, bar=2 )

for k, v in six.iteritems(d):
    print(k, v)

9

Як вам сказала б словникова документація для python 2 та python 3 , у python 2 itemsповертає список, а iteritemsповертає ітератор.

У python 3 itemsповертає вигляд , який приблизно аналогічний ітератору.

Якщо ви використовуєте python 2, ви можете скористатися користувачем, iteritemsякщо ви маєте справу з великими словниками, і все, що ви хочете зробити, - це переглядати елементи (не обов’язково копіювати їх у список)


Я розумію, що iteritemsце ітератор, тому він такий корисний. Я майже ніколи не хочу повторювати словник як список. То який правильний спосіб ітерації словника чимось генератором на зразок, сумісним і з Python 2, і з 3?

3
@ user248237 for key in some_dictпрацює на обох - і 2to3інструмент перейде iteritems()в items()будь-який момент ...
Джон Клементс

1
@JonClements: досить чесно, хоча я завжди думав, що for k in d: d[k]це зайве багатослівний / непітонічний

6

Як зазначав @Wessie dict.iteritems, dict.iterkeysі dict.itervalues(які повертають ітератор у Python2.x), а також 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'>

Що є більш ефективним, коли хочеться зробити зворотний пошук? переглянути об’єкти чи ітератор?
життєвий баланс

6

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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.