0

dict を並べ替えて値でリストするのは簡単ですが、特定の値を他の値と相関させるようにキーを並べ替える必要があります。

例:

x = [('key1', {'s': 'foo', 'w': 30}), ('key2', {'s': 'bar', 'w': 26}),
     ('key3', {'s': 'foo', 'w': 23}), ('key4', {'s': 'bar', 'w': 13})]

result: ['key2', 'key1', 'key3', 'key4']

これらは 'w' で並べられていますが、's' については、'w' が何らかのしきい値に達した場合、'foo' よりも 'bar' を優先します。これはどういうわけかPythonで実装されていますか、これを行うためのルールはありますか、それを処理するためのPythonライブラリを知っていますか?

機能を学習することではなく、私が指定した方法で順序付けすることです-ブーストまたは制限-値。

4

3 に答える 3

2

Python 2 では、次のようなものを使用できます。

def compare(item1, item2):
    key1, it1 = item1
    key2, it2 = item2
    if max(it1['w'], it2['w']) > threshold:
        return cmp(it1['s'], it2['s'])
    else:
        return cmp(it1['w'], it2['w'])

sorted(x, cmp=compare)

sortedPython 3で変更されました。使用する場合は参照してください

http://code.activestate.com/recipes/576653-convert-a-cmp-function-to-a-key-function/

于 2013-02-03T20:51:39.800 に答える
1

keyその複雑な並べ替えのニーズでは、またはcmpの属性を調べる必要がありますsorted()。詳細と例については、Python wiki を参照してください: http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

key単一の要素に基づいて重要度を判断できる場合に使用します。重要度が 2 つの要素間の関係に依存している場合は、 を使用するのが最適cmpです。

于 2013-02-03T20:44:49.677 に答える
0

これまでのところ答えはありませんが、私にとっての解決策は次のとおりです。

すべてのキーは 1.0 の先頭でスコアを取得し、すべての機能/値に対して sth を掛けます。最後に通常の注文を行います。

key1['score'] is 1.0

# feature 1
if key['s'] == foo:
    score = score * 0.1  
else:
    score = score * 0.6

# feature 2
... and so on

order keys by score, done. 

Thx、ご質問、ご意見、ご感想をお寄せください。

于 2013-02-06T21:28:11.277 に答える