167

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

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

4

7 に答える 7

158

Python 2.x では.items()、(キー、値) ペアのリストを返しました。Python 3.x では、動作が異なるオブジェクトになりました。そのため.items()、反復するか実体化する必要があります...したがって、Python 2.xの場合は必要です。itemviewlist(dict.items())dict.items()

Python 2.7 には、キー処理用のバックポートも少しあります。つまりviewkeysviewitemsviewvaluesメソッドがあり、最も便利なのは( から期待される)viewkeysのように動作するものです。setdict

簡単な例:

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

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

Python 3.xは一般mapitertools.imapに、より「怠惰」に作られています。zipitertools.izip

于 2012-12-21T23:31:48.193 に答える
108

dict.iteritems削除されたのは、python 2.x で行われたことを行うようになりdict.items、.dict.iteritemsitemview

于 2012-12-21T23:29:17.047 に答える
66

six ライブラリは、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)
于 2014-08-01T14:27:50.503 に答える
12

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

Python 3 では、 iterator とほとんど同じであるviewitemsを返します。

Python 2 を使用している場合、大規模な辞書を扱っていて、アイテムを反復処理するだけである場合は、ユーザーを使用iteritemsすることをお勧めします (必ずしもリストにコピーする必要はありません)。

于 2012-12-21T23:32:54.730 に答える
7

@Wessie が指摘したように、dict.iteritems,dict.iterkeysおよびdict.itervalues(Python2.x でイテレータを返す) とdict.viewitems,dict.viewkeysおよびdict.viewvalues( Python2.x でビュー オブジェクトを返す) はすべて Python3.x で削除されました。

Python2.x で辞書のリストのコピーを返すために使用されていたAnd とはdict.items、Python3.x ではビュー オブジェクトを返すようになりましたが、それでもiteratorと同じではありません。dict.keysdict.values

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'>
于 2013-12-02T12:53:02.833 に答える