通过多个值排名排序Python字典键

0 投票
3 回答
2471 浏览
提问于 2025-04-17 14:38

把字典按值排序很简单,但我想按键的顺序来调整,特别是想让某些值在和其他值的关系中更突出。

举个例子:

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'排序的,但如果'w'超过某个阈值,我们更喜欢's'中的'bar'而不是'foo'。 请问在Python中有没有办法实现这个?有没有什么规则或者库可以处理这个问题?

这不是在学习功能,而是想按照我指定的方式来排序——提升或限制这些值。

3 个回答

1

如果你有复杂的排序需求,可以看看 sorted() 函数里的 keycmp 属性。想了解更多细节和例子,可以去Python的维基百科:http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

如果你可以根据单个元素来判断它的重要性,就用 key。但如果重要性是由两个元素之间的关系决定的,那最好使用 cmp

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/

0

到目前为止,没有哪个答案对我有帮助,但我找到的解决办法是:

每个键一开始的分数都是1.0,然后对于每个特征或数值,我会用某个东西去乘这个分数,最后我会进行正常的排序。

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. 

谢谢你的提问、想法和评论。

撰写回答