【问题标题】:Sort dictionary by value, then by key按值排序字典,然后按键
【发布时间】:2021-03-30 11:12:14
【问题描述】:

嘿,我正在尝试按值从最高值到最低值对字典进行排序。 Howevet 我希望具有相同值的项目按键排序。

以下代码不起作用

dictionary = {"Sophie": 23, "Alfred": 23, "Zelda":22, "Betty":23}
sorted(dictionary.items(), key=lambda t: t[::-1])

输出:

[('Zelda', 22), ('Alfred', 23), ('Betty', 23), ('Sophie', 23)]

预期输出:

[('Alfred', 23), ('Betty', 23), ('Sophie', 23), ('Zelda', 22)]

按值递减排序,然后按键(按字母顺序)

【问题讨论】:

  • 您期望的输出是什么?看起来您试图按值(生成的 2 元组的第二个值)排序,然后按第一个排序。对我来说它看起来是正确的(23 之前的 22,A,B,然后是 23 的 S)。

标签: python python-3.x sorting dictionary


【解决方案1】:

由于您想使用一个键(值)按降序排序,而辅助键(名称)按升序排序,因此简单地颠倒排序顺序是行不通的。相反,您应该构造一个值和名称的元组,并将值取反以按降序对其进行排序:

sorted(dictionary.items(), key=lambda t: (-t[1], t[0]))

【讨论】:

  • 请重新阅读问题。 OP 只希望值按降序排列,但名称按常规字母升序排列。
  • 谢谢!好像你是唯一一个理解这个问题的人。你的实现非常适合我!!!
  • 嘿@blhsing。剩下的唯一问题是您的解决方案返回一个元组列表。我怎样才能让它返回字典?
  • 您可以将生成的元组列表传递给dict 构造函数以使用它构建新的字典:dict(sorted(dictionary.items(), key=lambda t: (-t[1], t[0])))
  • 非常感谢!
【解决方案2】:

选项1

这是他更现代的解决方案,仅适用于 python3.x,这与问题所采用的方法相同。而不是 t[::-1] 是您需要使用的索引 t: (-t[1], t[0]) .-t[1] 对名称进行排序升序,因为它已被否定。 t[0]按降序排列键。 代码如下:

dictionary = {"Sophie": 23, "Alfred": 23, "Zelda":22, "Betty":23}
reversed_dict= dict(sorted(dictionary.items(), key=lambda t: (-t[1], t[0])))
print(reversed_dict)

输出:

{'Alfred': 23, 'Betty': 23, 'Sophie': 23, 'Zelda': 22}

选项2

这是更便携的解决方案,适用于所有版本的 python。此方法要求您在开始之前导入 operator 库。 sorted(dictionary.items(), key=operator.itemgetter(0)) 按升序对名称进行排序,然后 sorted(reversed_dict, key=operator.itemgetter(1), reverse=True)) 按降序对键进行排序。

代码如下:

import operator

dictionary = {"Sophie": 23, "Alfred": 23, "Zelda":22, "Betty":23}
reversed_dict = sorted(dictionary.items(), key=operator.itemgetter(0))
reversed_dict = dict(sorted(reversed_dict, key=operator.itemgetter(1), reverse=True))
print(reversed_dict)

输出:

{'Alfred': 23, 'Betty': 23, 'Sophie': 23, 'Zelda': 22}

【讨论】:

  • 嘿,是的,这是可行的,但是具有相同值的项目仍未按字母顺序按键排序。这正是我的问题……
  • @Luke21 很高兴
  • 复制别人的代码而不给予信任是一种糟糕的形式。在将 dict 构造函数的使用复制到您的代码后,您也未能更新输出。
猜你喜欢
  • 2014-01-18
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2012-04-12
相关资源
最近更新 更多