私はPython辞書を持っています
steps = {1:"value1", 5:"value2", 2:"value3"}
これをキーでソートして反復処理する必要があります。
私はこれを試しました:
x = sorted(steps, key=lambda key: steps[key])
しかし、値は x からなくなっています。
私はPython辞書を持っています
steps = {1:"value1", 5:"value2", 2:"value3"}
これをキーでソートして反復処理する必要があります。
私はこれを試しました:
x = sorted(steps, key=lambda key: steps[key])
しかし、値は x からなくなっています。
これを反復する必要があるのは、キーでソートされた順序です。
lambdas
ここではやり過ぎだと思います。これを試してください:
>>> steps = {1:"val1", 5:"val2", 2:"val3"}
>>>
>>> for key in sorted(steps):
... print steps[key]
...
val1
val3
val2
steps.items()
dict の反復はそのキーのみを返すため、を反復する必要があります。
>>> x = sorted(steps.items())
>>> x
[(1, 'value1'), (2, 'value3'), (5, 'value2')]
ソートされたキーを反復処理します。
>>> for key in sorted(steps):
... # use steps[keys] to get the value
Python の多くの SortedDict コンテナー タイプの 1 つを使用することもできます。これらのタイプは、キー順にソートされたディクショナリを自動的に維持します。純粋な Python であり、C として高速な実装であるsortedcontainersモジュールを見てください。他のいくつかの実装を相互にベンチマークするパフォーマンス比較があります。
あなたの場合、次を使用します:
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
キー/値/アイテムの反復は、ソートされたキーの順序で自動的に機能します。
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