在 Python 中,怎样按多个属性对列表排序?
                           
天天向上
发布: 2025-01-02 22:17:53

原创
653 人浏览过

在 Python 中,按多个属性对列表排序可以使用内置的 sorted() 函数或列表的 sort() 方法,并结合 lambda 表达式或 operator 模块中的 itemgetter()

以下是具体的方法:


方法 1:使用 sorted()lambda

# 示例列表
data = [
    {"name": "Alice", "age": 25, "score": 85},
    {"name": "Bob", "age": 30, "score": 90},
    {"name": "Charlie", "age": 25, "score": 95},
    {"name": "David", "age": 30, "score": 85},
]

# 按 age 升序,score 降序排序
sorted_data = sorted(data, key=lambda x: (x['age'], -x['score']))

print(sorted_data)

说明

  • key 是一个函数,用于提取排序依据。
  • (x['age'], -x['score']) 表示先按 age 升序,再按 score 降序。
  • 如果不需要降序,去掉负号即可。

方法 2:使用 sort()lambda

sort() 是直接对列表进行原地排序,语法类似:

data.sort(key=lambda x: (x['age'], -x['score']))
print(data)

方法 3:使用 itemgetter(推荐用于字典列表)

operator.itemgetter 提供更高效的字段提取方法,适合对字典列表排序。

from operator import itemgetter

sorted_data = sorted(data, key=itemgetter('age', 'score'))
print(sorted_data)

注意

  • 默认排序为升序。如果需要降序,可以结合 reverse=True
  sorted_data = sorted(data, key=itemgetter('age', 'score'), reverse=True)
  • 对单个字段降序需用负号处理或将字段单独定义排序逻辑。

方法 4:对自定义对象排序

如果你的列表包含的是自定义对象,可以使用 attrgetterlambda

from operator import attrgetter

# 示例类
class Person:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
    def __repr__(self):
        return f"{self.name}({self.age}, {self.score})"

people = [
    Person("Alice", 25, 85),
    Person("Bob", 30, 90),
    Person("Charlie", 25, 95),
    Person("David", 30, 85),
]

# 按 age 升序,score 降序排序
sorted_people = sorted(people, key=lambda x: (x.age, -x.score))
print(sorted_people)

或使用 attrgetter

sorted_people = sorted(people, key=attrgetter('age', 'score'))

总结

  • 使用 lambda 是最灵活的方式,可以实现任意复杂的排序逻辑。
  • itemgetterattrgetter 在字段提取上性能更好,推荐优先使用。
  • 如果需要稳定排序(保持相等项的原有顺序),sorted() 默认是稳定的。
发表回复 0

Your email address will not be published. Required fields are marked *