すべての場所で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の場合は必要です。itemview
list(dict.items())
dict.items()
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
dict.iteritems
削除されたのは、python 2.x で行われたことを行うようになりdict.items
、.dict.iteritems
itemview
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.keys
dict.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'>