3

次のようなオブジェクトがあります。

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]}

ランダムなキー (string および/または int) を持つディクショナリで、すべてがさまざまなサイズのリストを値として持っています。

この辞書を、辞書項目のリストの長さに応じて順序付けられる OrderedDict に変換したいと考えています。だから注文した後、私は取得したい:

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..}

(2 つ以上の項目が同じ値の場合、それらの順序は重要ではありません。

私はこれを試しましたが、失敗しています:

OrderedDict(sorted(d, key=lambda t: len(t[1])))

私は経験がないので、私がしようとしていることが非常にばかげている場合はすみません。

私に何ができる?

ありがとうございました。

4

4 に答える 4

5

に渡したソート関数と実際には非常によく似ていましたsorted。注意すべきことは、 sorted が順番に辞書キーのインターラブルを返すことです。したがって、各キーで辞書にインデックスを付けるように関数を修正すると、次のようになります。

>>> sorted(t, key=lambda k: len(t[k]))
['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5']

キーが逆の順序で返され、これらのキーを直接反復するように指定することもできます。

>>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True):
...     print sorted_key, t[sorted_key]

rk5 [1, 100, 3, 4, 3, 3]
rand_key_2 [13, 23]
rand_key_3 [1]
rand_key_1 ['x']

通常、最新の辞書データを使用して新しい並べ替えられたリストを反復処理するだけなので、OrderedDict を作成する必要はありません。

于 2012-10-15T23:07:31.563 に答える
5

最初に単純な辞書の並べ替えを使用してから、次を使用しOrderedDict()ます。

>>> from collections import OrderedDict as od
>>> k=sorted(t, key=lambda x:len(t[x]), reverse=True)
>>> k
['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1']

>>> od((x, t[x]) for x in k)
OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])])
于 2012-10-15T22:38:29.877 に答える
3

順序付けられた辞書は挿入順序を記憶しているため、次のようにすることができます。

OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
于 2012-10-15T22:37:14.540 に答える
1

PythonのOrderedDictは、アイテムが挿入された順序を記憶するコレクションです。このコンテキストでの順序付けは、ソートされていることを意味するものではありません。

必要なのがすべてのアイテムをソートされた順序で取得することだけである場合は、次のようにすることができます。

for key, value in sorted(t, key = lambda x: -len(x[0])):
  # do something with key and value

ただし、まだソートされていないデータ構造を使用しています。ソートされた順序でデータ構造を反復処理するだけです。これは、k番目の要素、または内の要素の後続または先行を検索するような操作をまだサポートしていませんdict

于 2012-10-15T22:45:28.050 に答える