You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于双属性排序对象求助:优先按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:52:27