考虑以下字典:
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,因为在两个键上都调用了 reverse。
有没有有效的方法来解决这个问题?
请您参考如下方法:
按 负数 总计排序,这将反向将总计倒序排列,而无需使用 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 排序算法稳定;如果这两个元素的当前排序键结果相等,则这两个元素保持它们的相对位置。
