通过多个值排名排序Python字典键
把字典按值排序很简单,但我想按键的顺序来调整,特别是想让某些值在和其他值的关系中更突出。
举个例子:
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()
函数里的 key
或 cmp
属性。想了解更多细节和例子,可以去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.
谢谢你的提问、想法和评论。