考虑以下字典:
data = {'A':{'total':3},
'B':{'total':5},
'C':{'total':0},
'D':{'total':0},
}
上面所需的顺序是B,A,C,D。按降序排序,然后按升序排序。
当我致电sorted(data, key=lambda x: (data[x]['total'], x), reverse=True)
时
我得到B,A,D,C因为两个键都调用了反向。
有解决这个问题的有效方法吗?
答案 0 :(得分:5)
按否定总计排序,这样就可以反向排列总计,而不必使用reverse=True
。然后按顺序在密钥上打破关系:
sorted(data, key=lambda x: (-data[x]['total'], x))
演示:
>>> data = {'A':{'total':3},
... 'B':{'total':5},
... 'C':{'total':0},
... 'D':{'total':0},
... }
>>> sorted(data, key=lambda x: (-data[x]['total'], x))
['B', 'A', 'C', 'D']
此技巧仅适用于排序键中的数字组件;如果您有多个需要排序方向更改的键不数字,则必须进行多次排序(多次排序,从最后一个键到第一个):
# when you can't take advantage of numerical values to reverse on
# you need to sort repeatedly from last key to first.
# Here, sort forward by dict key, then in reverse by total
bykey = sorted(data)
final = sorted(bykey, key=lambda x: data[x]['total'], reverse=True)
这是有效的,因为Python排序算法稳定;如果当前排序键结果对于这两个元素是相等的,则两个元素保持它们的相对位置。