如何理解Python list.sort搭配lambda、map的自定义排序代码?
代码功能与运行原理解析
核心功能
这行代码用于对存储点分格式字符串(最常见的场景是版本号,例如"3.9.2"、"10.0.1")的列表做自然排序,规避了默认字符串字典序排序的逻辑缺陷。
逐环节拆解逻辑
list.sort(key=lambda v: map(int, v.split('.')))
list.sort()是Python列表的内置原地排序方法,通过key参数指定排序的依据:排序时会遍历列表内所有元素,把每个元素传入key对应的函数,用函数返回的结果作为比较排序的基准,不会直接对原始元素做比较。- 匿名函数
lambda v: map(int, v.split('.'))负责把原始的点分字符串转换为可按数值比较的序列,执行逻辑分两步:- 调用
v.split('.')把输入的字符串按.字符切割为字符串列表,例如输入"2.13.5"会得到["2", "13", "5"] - 调用
map(int, 切割结果)把列表里的每个字符串元素转换为整数,得到对应整数序列的可迭代对象,上面的例子转换后对应(2, 13, 5)
- 调用
- 排序时Python会按整数序列逐位比较大小:例如比较
"1.3.0"和"1.12.1"时,第一位1=1,第二位3<12,因此"1.3.0"会排在"1.12.1"前面,不会出现默认字符串排序中"1.12"排在"1.2"前面的错误(字符串逐字符比较时,"1.12"的第二位字符是'1',小于"1.2"的第二位字符'2')。
版本兼容性说明
这行代码可以直接在Python2环境下运行,因为Python2中map返回的是列表,原生支持序列比较;如果在Python3环境使用,需要把map的结果转换为元组,修改为如下代码才能正常运行:
list.sort(key=lambda v: tuple(map(int, v.split('.'))))
原因是Python3中map返回的是迭代器,不支持直接做大小比较。
内容的提问来源于stack exchange,提问作者Sracanis
相关产品推荐
相关产品推荐

