python dict键按多个值排序排序

时间:2013-02-03 20:24:20

标签: python sorting ranking rank

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

一个例子:

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 个答案:

答案 0 :(得分: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)
在python 3中更改了

sorted,如果你使用它,请参阅

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

答案 1 :(得分:1)

如果您打算根据自己的订单进行分类。这已在Sorting list of dictionaries according to specific order

中得到解答

答案 2 :(得分:1)

根据复杂的排序需求,您应该查看key的{​​{1}}或cmp属性。有关详细信息和示例,请参阅Python wiki:http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

如果可以根据单个元素确定重要性,请使用sorted()。如果重要性取决于两个元素之间的关系,那么最好使用key

答案 3 :(得分: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. 

感谢您提出问题,想法和意见。