Python中如何对多个字段按不同要求进行排序?

a=[('a',1,3,'f'),('b',1,2,'f'),('c',3,1,'m')]

要求按 4 升序、1 降序、2 升序、3 降序的优先规则进行排序

请问该如何写,谢谢。


Python中如何对多个字段按不同要求进行排序?
2 回复
# 假设我们有一个包含字典的列表,每个字典代表一个学生记录
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会按元组顺序比较。

关键点:

  1. 升序/降序控制:对数字字段,降序可以在值前加负号(如-x['score']),或者用reverse=True参数(但会影响所有字段)。
  2. 不同类型字段:如果字段不是数字(如字符串),降序可以返回(x['age'], x['score'])并设置reverse=True,或者用自定义比较逻辑。
  3. 稳定排序: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’)]

回到顶部