すべての場所でitems()代わりに使用することは合法ですか? Python 3 から削除されたのiteritems()はなぜですか? iteritems()素晴らしく便利な方法のようです。その背後にある理由は何ですか?
編集:明確にするために、Python 2 と Python 3 の両方と互換性のある方法で、ジェネレーターのような方法 (一度に 1 つの項目、メモリにすべてではなく) で辞書を反復処理するための正しいイディオムを知りたい?
すべての場所でitems()代わりに使用することは合法ですか? Python 3 から削除されたのiteritems()はなぜですか? iteritems()素晴らしく便利な方法のようです。その背後にある理由は何ですか?
編集:明確にするために、Python 2 と Python 3 の両方と互換性のある方法で、ジェネレーターのような方法 (一度に 1 つの項目、メモリにすべてではなく) で辞書を反復処理するための正しいイディオムを知りたい?
Python 2.x では.items()、(キー、値) ペアのリストを返しました。Python 3.x では、動作が異なるオブジェクトになりました。そのため.items()、反復するか実体化する必要があります...したがって、Python 2.xの場合は必要です。itemviewlist(dict.items())dict.items()
Python 2.7 には、キー処理用のバックポートも少しあります。つまりviewkeys、viewitemsとviewvaluesメソッドがあり、最も便利なのは( から期待される)viewkeysのように動作するものです。setdict
簡単な例:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
共通キーのリストが表示されますが、Python 3.x.keys()では代わりに使用してください。
Python 3.xは一般map的itertools.imapに、より「怠惰」に作られています。zipitertools.izip
dict.iteritems削除されたのは、python 2.x で行われたことを行うようになりdict.items、.dict.iteritemsitemview
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)
@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'>