Skip to main content
 首页 » 编程设计

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

2025年05月04日24lonelyxmas

考虑以下字典:

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