73

私はPython辞書を持っています

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

これをキーでソートして反復処理する必要があります。

私はこれを試しました:

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

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

4

6 に答える 6

108

これを反復する必要があるのは、キーでソートされた順序です。

lambdasここではやり過ぎだと思います。これを試してください:

>>> steps = {1:"val1", 5:"val2", 2:"val3"}
>>>
>>> for key in sorted(steps):
...     print steps[key]
...
val1
val3
val2
于 2013-05-23T09:27:47.150 に答える
30

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
于 2013-05-23T09:24:30.947 に答える
6

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

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

于 2014-04-07T18:25:43.340 に答える
1

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
于 2015-10-16T14:52:55.950 に答える