Python中如何对多个字段按不同要求进行排序?
a=[('a',1,3,'f'),('b',1,2,'f'),('c',3,1,'m')]
要求按 4 升序、1 降序、2 升序、3 降序的优先规则进行排序
请问该如何写,谢谢。
Python中如何对多个字段按不同要求进行排序?
# 假设我们有一个包含字典的列表,每个字典代表一个学生记录
students = [
{'name': 'Alice', 'age': 24, 'score': 85},
{'name': 'Bob', 'age': 22, 'score': 90},
{'name': 'Charlie', 'age': 24, 'score': 80},
{'name': 'David', 'age': 22, 'score': 95}
]
# 要求:先按年龄升序,年龄相同再按分数降序
sorted_students = sorted(students, key=lambda x: (x['age'], -x['score']))
print(sorted_students)
# 输出:
# [{'name': 'Bob', 'age': 22, 'score': 90},
# {'name': 'David', 'age': 22, 'score': 95},
# {'name': 'Charlie', 'age': 24, 'score': 80},
# {'name': 'Alice', 'age': 24, 'score': 85}]
核心方法是用sorted()或list.sort()的key参数,它接收一个函数,这个函数返回一个元组。元组中的每个元素对应一个排序字段,Python会按元组顺序比较。
关键点:
- 升序/降序控制:对数字字段,降序可以在值前加负号(如
-x['score']),或者用reverse=True参数(但会影响所有字段)。 - 不同类型字段:如果字段不是数字(如字符串),降序可以返回
(x['age'], x['score'])并设置reverse=True,或者用自定义比较逻辑。 - 稳定排序:Python的排序是稳定的,所以你可以分多次排序(从最次要字段开始),但用元组一次搞定更清晰。
更通用的写法(支持字符串降序等):
from operator import itemgetter
# 方法1:使用多个排序步骤(从最次要字段开始)
students.sort(key=itemgetter('score'), reverse=True) # 先按分数降序
students.sort(key=itemgetter('age')) # 再按年龄升序
# 方法2:自定义key函数处理复杂逻辑
def sort_key(student):
# 返回一个元组,每个元素对应一个排序优先级
# 对于字符串降序,可以取反或使用自定义排序键
return (student['age'],
-student['score'] if isinstance(student['score'], (int, float)) else student['score'])
sorted_students = sorted(students, key=sort_key)
一句话总结:用返回排序键元组的lambda或函数作为key参数。
from functools import cmp_to_key
def keyfunc(x,y):
□□□□if x[3] > y[3]:
□□□□□□□□return 1
□□□□elif x[3] < y[3]:
□□□□□□□□return -1
□□□□elif x[0] < y[0]:
□□□□□□□□return 1
□□□□elif x[0] > y[0]:
□□□□□□□□return -1
□□□□elif x[1] > y[1]:
□□□□□□□□return 1
□□□□elif x[1] < y[1]:
□□□□□□□□return -1
□□□□elif x[2] < y[2]:
□□□□□□□□return 1
□□□□elif x[2] > y[2]:
□□□□□□□□return -1
□□□□else:
□□□□□□□□return 0
a=[(‘a’,1,3,‘f’),(‘b’,1,2,‘f’),(‘c’,3,1,‘m’)]
print(sorted(a, key=cmp_to_key(keyfunc)))
# [(‘b’, 1, 2, ‘f’), (‘a’, 1, 3, ‘f’), (‘c’, 3, 1, ‘m’)]

