8

Python 2 と Python 3 の両方で機能する辞書の値/項目を効率的に反復処理する方法はありますか?

Python 2では、次のように書くことができます

for x in mydict:
for x in mydict.iterkeys():
for x in mydict.viewkeys():
for x in mydict.itervalues():
for x in mydict.viewvalues():
for x in mydict.iteritems():
for x in mydict.viewitems():

Python 3 では、次の可能性があります。

for x in mydict:
for x in mydict.keys():
for x in mydict.values():
for x in mydict.items():

でキーを反復処理できますfor x in mydict。これは Python 2 と 3 の両方で機能します。しかし、普遍的に機能する値とキーと値のペア (「アイテム」) を反復処理する方法はありますか? 両方のバージョンの Python で実行できる Python コードを作成するために必要です。

(ちなみに、イテレータを使用したその他の障害は簡単に回避できます。たとえば、次のようになります。

if sys.version_info.major<3:
    from itertools import izip as zip, imap as map

mapただし、辞書メソッドはやのように簡単に再定義することはできませんzip。)

何か案は?

4

4 に答える 4

9

values() バージョンの Just another dunce's answer

for value in (mydict[key] for key in mydict):

また

def dict_values(d):
   return (mydict[key] for key in mydict)

def dict_items(d):
   return ((key, mydict[key]) for key in mydict)

for value in dict_values(mydict):
    ...

for value in dict_items(mydict):
    ...

これはかなりヤバイですけどね。Python のバージョンを確認し、ジェネレーターを返す代わりに、必要に応じてd.items()またはを返すことができます。d.iteritems()

より良い質問は、2to3 で適切に動作し、優れた Python3 コードを生成する Python2 コードを作成する方法であると思います

于 2012-05-02T05:34:41.627 に答える
8

次のコードは、Py2 と Py3 の両方で機能します。

def iteritems(d):
    'Factor-out Py2-to-3 differences in dictionary item iterator methods'
    try:
         return d.iteritems()
    except AttributeError:
         return d.items()

d = dict(red=1, blue=2, green=3)
for k, v in iteritems(d):
    print(k)
    print(v)
    print('')

このソリューションには、独自のジェネレーターをローリングして独自のルックアップを行うのではなく、ネイティブのイテレーターを使用できるという利点があります。ネイティブの反復子は、提示された他のソリューションよりも高速です。

于 2012-05-02T06:56:15.023 に答える
3

これにより、ジェネレーターが提供されます。

for key,value in ((key,mydict[key] for key in mydict)

リストが必要な場合は、式の外側で()の代わりに[]を使用します

于 2012-05-02T05:29:37.677 に答える
0

Python2.7.itemsのディクショナリには、(キー、値)タプルを反復処理できるメソッドがあります。Python3のAPIは同じです(実装は異なりますが)。これはあなたのために働きますか?

于 2012-05-02T05:27:17.177 に答える