0

很容易对字典进行排序以按值列出,但我需要通过提升与其他值相关的特定值来对键进行排序。

一个例子:

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'达到某个阈值,我们更喜欢'bar'而不是'foo'。这是否以某种方式在 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)

sorted在 python 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如果可以基于单个元素确定重要性,则使用。如果重要性取决于两个元素之间的关系,则最好使用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. 

谢谢,对于您的问题、想法和评论。

于 2013-02-06T21:28:11.277 回答