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
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
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
キー/値/アイテムの反復は、ソートされたキーの順序で自動的に機能します。
キーが整数ではなく、整数として解析される文字列の場合:
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
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
ユースケースによっては、すでに順序付けされた辞書を保持するオプションがあります。詳細については、pythons OrderedDict を参照してください。キーを整数としてソートする場合は、それらを整数に変換する必要があります。最適なタイミングは、ユースケースによって異なります。