web-dev-qa-db-ja.com

python:キーでソートされた辞書を反復処理する

Python辞書があります

steps = {1:"value1", 5:"value2", 2:"value3"}

これはキーでソートされた順序で繰り返す必要があります。

私はこれを試しました:

x = sorted(steps, key=lambda key: steps[key])

しかし、値はxからなくなっています。

50
user984003

これはキーでソートされた順序で繰り返す必要があります。

lambdasはここでは過剰だと思うので、これを試してください:

>>> steps = {1:"val1", 5:"val2", 2:"val3"}
>>>
>>> for key in sorted(steps):
...     print steps[key]
...
val1
val3
val2
86

Dictに対する反復はそのキーのみを返すため、steps.items()に対して反復する必要があります。

>>> x = sorted(steps.items())
>>> x
[(1, 'value1'), (2, 'value3'), (5, 'value2')]

ソートされたキーを反復処理します。

>>> for key in sorted(steps):
...     # use steps[keys] to get the value
15

Pythonの多くのSortedDictコンテナタイプの1つを使用することもできます。これらのタイプは、キー順でソートされた辞書を自動的に維持します。 sortedcontainers モジュールを見てください。このモジュールは、純粋なPythonであり、Cとして高速に実装されています。 パフォーマンス比較 があり、他のいくつかの実装を互いにベンチマークします。

あなたのケースでは、あなたは使用します:

from sortedcontainers import SortedDict
steps = SortedDict({1:"value1", 5:"value2", 2:"value3"})

# Then iterate the items:

for key, value in steps.items():
    print key, value

# Or iterate the values:

for value in steps.values():
    print value

キー/値/アイテムの反復は、ソートされたキーの順序で自動的に機能します。

6
GrantJ

キーが整数ではなく、整数として解析される文字列の場合:

steps = {'1':'value1', '10': 'value0', '5':'value2', '2':'value3'}

ソリューションに似たものを使用できます。

for key, value in sorted(steps, key=lambda key: int(key[0])):
    print(key)

1
2
5
10
2
David Nathan

Zagorulkin Dmitryが指摘したように、ラムダをソート関数に渡すべきではありません。ソート機能のデフォルトの動作は、キーに作用することです。

steps = {1:"val1", 5:"val2", 2:"val3"}

for key in sorted(steps):
   print steps[key]
...
val1
val3
val2

ただし、ラムダを並べ替え関数に渡すことは、小さな利点(つまり「過剰」)のより良い操作ではありませんが、実際には望ましくありません。特に、非常に大きな辞書に適用したり、複数回呼び出したりする場合、コードが読みにくくなり、速度も低下します。 (キー、値)のペアに関してソートターゲットをより明示的にする以外に、ソートターゲットを使用するメリットはありません。次のタイミングは、ラムダを指定したときに得られるパフォーマンスヒットを示しています。

steps = {randint(0, 100000): randint(0, 100000) for _ in range(100000) } # random dict

%%timeit 
sort_list = [value for _, value in sorted(steps.items(), key=lambda item: item[0])]
1 loops, best of 3: 241 ms per loop

%%timeit 
sort_list = [steps[k] for k in sorted(steps, key=lambda k: k)]
1 loops, best of 3: 196 ms per loop

%%timeit
sort_list = [ steps[key] for key in sorted(steps) ]
10 loops, best of 3: 106 ms per loop
1
Angelos

ユースケースによっては、すでに順序付けされた辞書を保持するオプションがあります。詳細については、pythons OrderedDict を参照してください。キーを整数としてソートする場合は、それらを整数に変換する必要があります。最適なタイミングは、ユースケースによって異なります。

0
Achim