按值排序字典,然后按键排序

4

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

以下代码无法正常工作。

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)]

按降序排列值,然后按键排序(按字母顺序)


1
你期望的输出是什么?看起来你试图按值(结果2元组的第二个值)进行排序,然后再按第一个值进行排序。在我看来这是正确的(22在23之前,A、B,然后是S的23)。 - metatoaster
2个回答

4

如果你想按一个键(值)降序排序和另一个键(名称)升序排序,简单地反转排序顺序是不起作用的。相反,你应该构建一个包含值和名称的元组,并对值进行取反以使其按降序排序:

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

嘿@blhsing。唯一剩下的问题是你的解决方案返回一个元组列表。我该如何使它返回一个字典? - Luke21
你可以将生成的元组列表传递给 dict 构造函数,以构建一个新的字典:dict(sorted(dictionary.items(), key=lambda t: (-t[1], t[0]))) - blhsing

1

选项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
@Luke21 很高兴见到你。 - TERMINATOR
抄袭别人的代码而不注明来源是一种不好的行为。你还没有更新你的输出,把dict构造函数复制到了你的代码中。 - blhsing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接