如何按两个元素对字典进行排序,只反转一个

时间:2016-11-04 15:20:47

标签: python sorting dictionary

考虑以下字典:

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因为两个键都调用了反向。

有解决这个问题的有效方法吗?

1 个答案:

答案 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排序算法稳定;如果当前排序键结果对于这两个元素是相等的,则两个元素保持它们的相对位置。