items()の代わりにiteritems()を使用する必要があるのはいつですか?


153

すべての場所items()iteritems()はなく使用することは合法ですか?なぜiteritems()Python 3から削除されたのですか?素晴らしくて便利な方法のようです。その背後にある理由は何ですか?

編集:明確にするために、Python 2とPython 3の両方と互換性のある方法で、ジェネレーターのような方法(一度に1つのアイテム、すべてがメモリではない)で辞書を反復するための正しいイディオムは何かを知りたい?

回答:


148

Python 2.xでは- .items()(キー、値)のペアのリストを返しました。Pythonの3.xのでは、.items()今でitemview異なる振る舞いオブジェクト、 -それはので、持って繰り返し処理するために、またはマテリアライズド...だから、list(dict.items())何であったかのために必要とされるdict.items()のPython 2.xでは

Python 2.7にはviewkeysviewitemsviewvaluesメソッドがあるという点で、キー処理用のバックポートが少しあります。最も有用viewkeysなのは、set(から期待するdict)aのように動作することです。

簡単な例:

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())

共通キーのリストが表示されますが、Python 3.xでは、.keys()代わりに使用してください。

Python 3.xは一般に、より「怠惰」になるように作られています。つまりmap、今itertools.imapzipは効果的ですitertools.izip


96

dict.iteritemsので、削除されたdict.items今、事はないdict.iteritemsのpython 2.xの中でやったとでもそれ作ることによって、それを少し改善itemview


64

6つのライブラリは、python 2.5+とpython 3の両方と互換性のあるコードの記述に役立ちます。これには、python 2と3の両方で機能するiteritemsメソッドがあります。例:

import six

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

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

9

python 2python 3の辞書のドキュメントでわかるように、python 2 itemsではリストをiteritems返し、イテレータを返します。

Python 3ではitemsビューを返します。これはイテレータとほとんど同じです。

python 2を使用しているiteritems場合、大きな辞書を扱っていて、やりたいことはアイテムを反復することだけです(必ずしもアイテムをリストにコピーする必要はありません)。


私はそれiteritemsがイテレータであることを理解しています、それがとても便利な理由です。辞書をリストとして繰り返し処理することはほとんどありません。では、Python 2とPython 3の両方と互換性のある方法で、ジェネレーターを使用して辞書を反復処理する正しい方法は何ですか?

3
@ user248237 for key in some_dictは両方で動作し、2to3ツールはとにかく変換さiteritems()items()ます...
Jon Clements

1
@JonClements:十分に公平ですが、私for k in d: d[k]は不必要に冗長/非Pythonicであると常に思っていました

6

@Wessieは、注目だけとしてdict.iteritemsdict.iterkeys及びdict.itervalues(戻りれるイテレータ Python2.xでの)、ならびにdict.viewitemsdict.viewkeys及びdict.viewvalues(そのリターンビューオブジェクト Python2.xに)全てPython3.xで除去しました

そしてdict.itemsdict.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'

Python 3で利用可能なviewitemsについても同様です。

また、itemsはディクショナリの(key, value)ペアのリストのコピーを返すため、とにかくコピーを作成する場合を除き、効率が低下します。

Python 2では、iteritems反復に使用するのが最適です。Python 3へのアップグレードを決定2to3したitems場合、このツールで置き換えることができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.