基于双属性排序对象求助:优先按count、次按name排序
解决Person列表的自定义排序问题
没问题,我来帮你搞定这个排序需求!你想要的是优先按count降序排列,count相同时按name字母升序排列,用Python的排序工具很容易实现,下面给你两种靠谱的方法:
方法一:用lambda表达式作为排序key(最直观)
Python的sorted()函数(或者列表的.sort()方法)支持通过key参数自定义排序规则。我们可以返回一个元组,元组的第一个元素是-p._count(用负数实现降序),第二个元素是p._name(自然字母升序),排序时会先比较第一个元素,相等时再比较第二个元素。
完整示例代码:
class Person: def __init__(self, name, count): self._name = name self._count = count def __str__(self): return f"{self._name} : {self._count}" # 初始化你的示例列表 people = [ Person("David", 10), Person("Steve", 5), Person("Josh", 5), Person("Anthony", 5) ] # 执行排序 sorted_people = sorted(people, key=lambda p: (-p._count, p._name)) # 打印结果 for p in sorted_people: print(p)
运行后会输出:
David : 10 Anthony : 5 Josh : 5 Steve : 5
方法二:利用稳定排序的特性(分步排序)
Python的排序是稳定的——如果两个元素的排序key相同,它们会保留原来的相对顺序。我们可以先按name升序排序,再按count降序排序,这样count相同的元素就会保留name的排序结果:
# 先按name升序排 people.sort(key=lambda p: p._name) # 再按count降序排(稳定排序会保留name的顺序) people.sort(key=lambda p: p._count, reverse=True) # 打印结果 for p in people: print(p)
这个方法和方法一的效果完全一样,适合你想原地修改列表的场景(.sort()是原地排序,而sorted()会返回新列表)。
为什么这样可行?
- 对于count的降序:用
-p._count让大的count对应的负数更小,在默认升序排序中会排在前面;或者用reverse=True直接对count降序。 - 对于name的升序:Python字符串默认的比较就是按字母顺序(ASCII码顺序,对于英文名字来说正好符合需求)。
内容的提问来源于stack exchange,提问作者ARol101
相关产品推荐
相关产品推荐

