1 つは、a を並べ替えているのではなく (dict
のリストを並べ替えている)、dicts
これらは非常に異なるものdict
です。特に、Python では a には定義された順序がありません。
sorted()
と を使用すると、これを簡単に行うことができますoperator.itemgetter()
。
import operator
sorted_dicts = sorted(dicts, key=operator.itemgetter("diff"))
sorted()
ビルトインは、値を受け取る関数であるキーワードkey
引数を取り、ソートする別の値を与えます。ここでは、 を使用してitemgetter()
から目的の値を取得し、dict
並べ替えます。
編集:
あなたの変更を考えると、あなたが不明確であるため、2つの答えがあります。値のリストが必要な場合は、元の値からそれらを抽出するだけですdict
:
sorted(users.values(), key=operator.itemgetter("diff"))
これは取るのと同じくらい簡単dict.values()
です。当然、Python 2.x では、パフォーマンスを向上させるためにviewitems()
orを使用する必要iteritems()
があります。
dict
それ自体をソートしたい場合、それは別の問題dict
です.s(私が述べたように)は本質的に順序付けされていないからです。
まず第一に、sorted(dict)
あなたが提案した出力を生成しないことに注意したいと思います.dictは、デフォルトでは値ではなく、キーを反復処理します:
users = {
'<User: user10>': {'alike': 1, 'diff': 46},
'<User: user11>': {'alike': 3, 'diff': 37},
'<User: user12>': {'alike': 0, 'diff': 50},
'<User: user13>': {'alike': 0, 'diff': 50},
'<User: user14>': {'alike': 0, 'diff': 50},
'<User: user15>': {'alike': 0, 'diff': 50},
'<User: user16>': {'alike': 0, 'diff': 50},
'<User: user17>': {'alike': 0, 'diff': 50},
'<User: user18>': {'alike': 0, 'diff': 50},
'<User: user19>': {'alike': 0, 'diff': 50},
'<User: user20>': {'alike': 0, 'diff': 50},
'<User: user2>': {'alike': 1, 'diff': 48},
'<User: user3>': {'alike': 2, 'diff': 42},
'<User: user4>': {'alike': 1, 'diff': 45},
'<User: user5>': {'alike': 2, 'diff': 43},
'<User: user6>': {'alike': 1, 'diff': 46},
'<User: user7>': {'alike': 1, 'diff': 46},
'<User: user8>': {'alike': 1, 'diff': 49},
'<User: user9>': {'alike': 0, 'diff': 50}
}
print(sorted(users))
私たちに与えます:
['<User: user10>', '<User: user11>', '<User: user12>', '<User: user13>', '<User: user14>', '<User: user15>', '<User: user16>', '<User: user17>', '<User: user18>', '<User: user19>', '<User: user20>', '<User: user2>', '<User: user3>', '<User: user4>', '<User: user5>', '<User: user6>', '<User: user7>', '<User: user8>', '<User: user9>']
ソート済みを生成するdict
には、次を使用する必要がありますcollections.OrderedDict()
。
import collections
users = {
'<User: user10>': {'alike': 1, 'diff': 46},
'<User: user11>': {'alike': 3, 'diff': 37},
'<User: user12>': {'alike': 0, 'diff': 50},
'<User: user13>': {'alike': 0, 'diff': 50},
'<User: user14>': {'alike': 0, 'diff': 50},
'<User: user15>': {'alike': 0, 'diff': 50},
'<User: user16>': {'alike': 0, 'diff': 50},
'<User: user17>': {'alike': 0, 'diff': 50},
'<User: user18>': {'alike': 0, 'diff': 50},
'<User: user19>': {'alike': 0, 'diff': 50},
'<User: user20>': {'alike': 0, 'diff': 50},
'<User: user2>': {'alike': 1, 'diff': 48},
'<User: user3>': {'alike': 2, 'diff': 42},
'<User: user4>': {'alike': 1, 'diff': 45},
'<User: user5>': {'alike': 2, 'diff': 43},
'<User: user6>': {'alike': 1, 'diff': 46},
'<User: user7>': {'alike': 1, 'diff': 46},
'<User: user8>': {'alike': 1, 'diff': 49},
'<User: user9>': {'alike': 0, 'diff': 50}
}
print(collections.OrderedDict(sorted(users.items(), key=lambda x: x[1]["diff"])))
これにより、次のことがわかります。
OrderedDict([('<User: user11>', {'diff': 37, 'alike': 3}), ('<User: user3>', {'diff': 42, 'alike': 2}), ('<User: user5>', {'diff': 43, 'alike': 2}), ('<User: user4>', {'diff': 45, 'alike': 1}), ('<User: user10>', {'diff': 46, 'alike': 1}), ('<User: user7>', {'diff': 46, 'alike': 1}), ('<User: user6>', {'diff': 46, 'alike': 1}), ('<User: user2>', {'diff': 48, 'alike': 1}), ('<User: user8>', {'diff': 49, 'alike': 1}), ('<User: user20>', {'diff': 50, 'alike': 0}), ('<User: user9>', {'diff': 50, 'alike': 0}), ('<User: user13>', {'diff': 50, 'alike': 0}), ('<User: user19>', {'diff': 50, 'alike': 0}), ('<User: user12>', {'diff': 50, 'alike': 0}), ('<User: user18>', {'diff': 50, 'alike': 0}), ('<User: user15>', {'diff': 50, 'alike': 0}), ('<User: user14>', {'diff': 50, 'alike': 0}), ('<User: user17>', {'diff': 50, 'alike': 0}), ('<User: user16>', {'diff': 50, 'alike': 0})])
残念ながら複数レベルのアイテムを取得できないため、ここでlambda
は key 引数にステートメントを使用する必要があったことに注意してください。itemgetter()