回答:
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
)aのように動作することです。
簡単な例:
common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())
共通キーのリストが表示されますが、Python 3.xでは、.keys()
代わりに使用してください。
Python 3.xは一般に、より「怠惰」になるように作られています。つまりmap
、今itertools.imap
でzip
は効果的ですitertools.izip
。
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)
python 2とpython 3の辞書のドキュメントでわかるように、python 2 items
ではリストをiteritems
返し、イテレータを返します。
Python 3ではitems
、ビューを返します。これはイテレータとほとんど同じです。
python 2を使用しているiteritems
場合、大きな辞書を扱っていて、やりたいことはアイテムを反復することだけです(必ずしもアイテムをリストにコピーする必要はありません)。
for key in some_dict
は両方で動作し、2to3
ツールはとにかく変換さiteritems()
れitems()
ます...
@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'>
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
場合、このツールで置き換えることができます。
future.utilsはpython 2および3の互換性を可能にします
# Python 2 and 3: option 3
from future.utils import iteritems
heights = {'man': 185,'lady': 165}
for (key, value) in iteritems(heights):
print(key,value)
>>> ('lady', 165)
>>> ('man', 185)
iteritems
がイテレータであることを理解しています、それがとても便利な理由です。辞書をリストとして繰り返し処理することはほとんどありません。では、Python 2とPython 3の両方と互換性のある方法で、ジェネレーターを使用して辞書を反復処理する正しい方法は何ですか?