在 Python 中,怎样按多个属性对列表排序?
在 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:对自定义对象排序
如果你的列表包含的是自定义对象,可以使用 attrgetter 或 lambda。
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是最灵活的方式,可以实现任意复杂的排序逻辑。 itemgetter和attrgetter在字段提取上性能更好,推荐优先使用。- 如果需要稳定排序(保持相等项的原有顺序),
sorted()默认是稳定的。