web-dev-qa-db-ja.com

OrderedDictを反復処理する最もPython的な方法は何ですか

OrderedDictがあり、ループ内でインデックス、キー、および値を取得したい。複数の方法で実行できることは確かです。

a = collections.OrderedDict({…})
for i,b,c in Zip(range(len(a)), a.iterkeys(), a.itervalues()):
  …

しかし、私はrange(len(a))を避け、a.iterkeys()、a.itervalues()をa.iteritems()のようなものに短縮したいと思います。 enumerateおよびiteritemsを使用して、次のように言い換えることができます。

for i,d in enumerate(a.iteritems()):
  b,c = d

ただし、ループ本体内で展開する必要があります。 forステートメントで展開する方法、または反復するよりエレガントな方法はありますか?

27
Askold Ilvento

forステートメント でタプルのアンパックを使用できます:

_for i, (key, value) in enumerate(a.iteritems()):
    # Do something with i, key, value
_

_>>> d = {'a': 'b'}
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print i, key, value
... 
0 a b
_

サイドノート:

Python 3.x、では、反復可能な辞書ビューを返す dict.items() を使用します。

_>>> for i, (key, value) in enumerate(d.items()):
...     print(i, key, value)
_
53
falsetru
$ python
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information. 
>>> import collections
>>> a = collections.OrderedDict({'a':'1','b':'2'})
>>> a
OrderedDict([('a', '1'), ('b', '2')])
>>> for i, (k,v) in enumerate(a.iteritems()):
...    print i, k, v
... 
0 a 1
1 b 2

あなたが私に尋ねると、いです。

なぜインデックスに興味があるのか​​わかりません。 dictとの間の考え方は、インデックスを知らないということです。 dictとqueueの背後には非常に多くのロジックがありますので、インデックスから解放されます。

インデックスの取得を主張する場合は、2回繰り返す必要はありません。

Enumerateがリストに対して行うことを見てみましょう:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']    
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

「開始」に注意してください。

列挙はリストの管理方法を知っています。辞書は、獣の腹のどこかにデータをリストとして保存します。では、dictでenumerateを使用するとどうなりますか?

>>> for i,k in enumerate(a):
...    print i,k
... 
0 a
1 b

この観点から、私はエレガントを求めています。

>>> for i,k in enumerate(a):
...    print i,k,a[k]
... 
0 a 1
1 b 2

「for i、(k、v)in」では、内部構造の露出が早すぎます。 「for i、k in」を使用すると、保護され、リファクタリングが必要になったときにループする方法に触れる必要がありません。ループ内で行うことのみを変更する必要があります。面倒を見る面が1つ少ない。

列挙へのこの呼び出しは、pythonの後の2.6で:

https://docs.python.org/2/library/stdtypes.html#dict.iteritems

https://docs.python.org/2/library/functions.html#enumerate

2
Andrei

valuesまたはitemsメソッドを使用してviewを取得し、それをiteratorとしてタイプセットします。

例えば辞書の値でソートする

sorted(iter(my_dict.values()))
0
SumNeuron