【问题标题】:How to sort a dictionary by two elements, reversing only one如何按两个元素对字典进行排序,只反转一个
【发布时间】:2016-11-04 15:20:47
【问题描述】:

考虑以下字典:

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。

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

【问题讨论】:

  • 您必须进行两次排序。

标签: python sorting dictionary


【解决方案1】:

负数总数排序,这会将总数反向排列,而无需使用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 排序算法是稳定的;如果这两个元素的当前排序键结果相等,则两个元素保持它们的相对位置。

【讨论】:

  • 这很聪明,但是如果要求对这两种类型都使用字符串,有没有什么方法可以在没有 2 遍的情况下做到这一点?
  • @Murphy4:在这种情况下,如果没有 2 次通过,就无法做到这一点。
  • 感谢您将最后一个键指定为第一个。很好的答案。
猜你喜欢
  • 2023-04-05
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2016-03-14
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多