Python调用sort函数自定义排序函数

本文介绍了在Python中对复杂对象排序的问题,原计划通过重载cmp函数实现,但在Python3中已被移除。作者发现可以使用functools模块的cmp_to_key方法替代,展示了如何在Python3中正确地进行自定义排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当有一组比较复杂的对象需要进行排序时,我们的第一想法就是尽量利用已有的函数快速完成自己的排序需求。接触过c++的码友应该知道,在c++里若想利用已有的sort函数来完成复杂的排序,对运算符进行重载即可(好久没接触过c++里的概念,应该是这个叫法)。

笔者刚刚需要在python里面进行相关的操作,也试了用这样的方法,但是会提示报错

def comp(x, y):
	pass
	
X = sorted(X, cmp=comp)

笔者的写法类似于以上写法,就是定义了一个comp函数,如果 x < y x<y x<y,则返回负数-1;如果 x > y x>y x>y,则返回正数1,否则返回0.然后在sorted函数中直接将comp函数传给cmp参数。但是会报错,查阅博客找到原因是因为python2中仍然有cmp的参数,按上述方法进行操作没有问题;但是python3中去掉了cmp参数,因此不能按以上方法进行操作。

但是稍微再利用一下functools包里面的cmp_to_key()方法就行了,从刚刚那篇博客里贴一个简单的例子,供笔者自己以后查阅

from functools import cmp_to_key
 
nums = [4, 3, 2, 1]
sorted(nums,key=cmp_to_key(lambda a, b: a - b))
### 实现自定义排序Python中,`sort()`方法和内置函数`sorted()`都可以用于对列表进行排序,并且两者均支持`key`参数来指定一个函数(或其它可调用对象),该函数会被应用于每个元素以决定其排序依据。 对于简单的升序排列,默认情况下无需提供额外的关键字参数;然而当涉及到更复杂的逻辑时——比如忽略大小写或者基于对象属性排序,则可以通过设置`key`参数来自定义比较行为[^1]。 #### 使用 `list.sort()` 进行原地排序 下面是一个使用字符串长度作为排序准则的例子: ```python words = ["apple", "banana", "cherry"] words.sort(key=len) print(words) # 输出: ['apple', 'cherry', 'banana'] ``` 这段代码会按照单词的字符数从小到大重新安排列表中的顺序。这里`len`是Python内建的一个返回序列长度的函数,在这里是用来获取各个字符串的长度以便于排序[^2]。 #### 利用 `sorted()` 函数创建新的已排序列表 如果不想改变原始列表而只是想得到一个新的有序版本的话,应该选择`sorted()`而不是修改原有结构的方法。它同样接受`key`参数来进行定制化处理: ```python students = [("Alice", 89), ("Bob", 76), ("Charlie", 90)] sorted_students = sorted(students, key=lambda student: student[1]) print(sorted_students) # 输出: [('Bob', 76), ('Alice', 89), ('Charlie', 90)] ``` 在这个例子中,lambda表达式被用来提取元组里的第二个元素即成绩分数作为排序关键字[^3]。 #### 更加复杂的情况下的应用 有时候可能需要更加精细控制排序过程,例如先按姓氏字母表顺序排,同名则进一步考虑年龄等因素。这时可以在`key`参数处传入更为复杂的函数完成多级排序需求。 ```python people = [ {"name": "John Doe", "age": 45}, {"name": "Jane Smith", "age": 32}, {"name": "Jim Brown", "age": 32} ] def get_sort_key(person): return (person['name'].split()[1], person['age']) ordered_people = sorted(people, key=get_sort_key) for p in ordered_people: print(f"{p['name']} ({p['age']})") # 可能输出如下: # Jane Smith (32) # Jim Brown (32) # John Doe (45) ``` 上述代码展示了如何通过构建一个多字段组合键的方式实现了首先根据名字最后部分(假设为家庭名称)排序,其次才是个人岁数这样的双重条件排序机制[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

INEVGVUP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值