Python列表使用sort方法时不能使用key=self.index方法的问题探究

在使用python对列表排序的时候,突然发现了一个有意思的现象。对列表a,在使用a.sort()方法进行排序时,使用key参数,不能使用自己的方法,比如a.index等方法

使用失败的示例

代码目标是对列表以其元素第一次出现的顺序进行排序。

此时会引发一个ValueError,提示在排序时第一个元素不在列表内。

这里看不出什么情况,需要自己实现下index方法来处理

模拟index方法

定义find_index函数,使用functools中的partial方法定义偏函数来实现index方法

在14行调用偏函数时,可以发现我们在其中显示的是列表和其元素参数,但在17行进行调用时,列表变成了空列表。

如果我们在其中使用id方法来检测列表的id时,会发现从始至终,这个列表的id是没有变的。说明在使用sort()方法排序的时候,列表会先变成空列表再往里排东西。

此处实现经过查询资料,发现是在源码中有体现

cpython/Objects/listobject.c at main · python/cpython · GitHub

在使用sort方法进行排序的时候,列表会先置为空的,所以原有列表打印的时候是个空列表,使用原有列表的index方法来排序就会失败。

如果我们确实需要实现这个排序,可以借助sorted函数来使用一个拷贝实现。

此时不会报错,得到的效果也是预期的排序方式。

在算法层面,我们自己写的排序不太可能比内置的sort快,内置的sort是用的底层c语言写的,怎么用python重复造轮子也很难超越,不必去钻此类牛角尖。

而sort和sorted相比,因为少了副本拷贝,速度上会比sorted快一些,但像上面的场景,我们就需要考虑舍弃这点性能了。 希望这篇文章能对大家有所帮助!

相关推荐
兵慌码乱9 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵10 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio14 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636715 小时前
使用 Python 从零创建 Word 文档
python
Csvn20 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽21 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱2 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei2 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python