为什么sort(key=lambda x: x[0])按列表内每个元素的首值排序?
请问在上述解决方案中,
intervals.sort(key=lambda x: x[0])为什么会按列表中每个元素的起始值排序?x[0]难道不是指代整个列表的第一个元素吗?
原理说明
核心是对sort的key参数和lambda形参的作用范围存在误解,具体逻辑如下:
- Python列表的
sort()方法中,key参数要求传入一个仅接收单个参数的函数,这个函数会被自动依次作用到列表的每一个独立元素上,排序时会以这个函数的返回值作为比较依据,而非元素本身。 - 这里传入的
lambda x: x[0]就是符合要求的单参数函数,其中的x是lambda的局部形参,指代的是intervals列表中的每一个子元素(也就是每个类似[1,4]的时间区间子列表),和外层的intervals大列表没有直接关系。形参名可以随意替换,下面的写法和原代码效果完全等价,可读性更高:intervals.sort(key=lambda interval: interval[0]) - 举实际运行示例说明,当
intervals = [[6, 7], [2, 4], [8, 12]]时,排序过程会自动遍历每个子元素计算key值:- 子元素
[6,7]传入lambda形参,返回key值6 - 子元素
[2,4]传入lambda形参,返回key值2 - 子元素
[8,12]传入lambda形参,返回key值8
排序时按照key值从小到大重排子元素,最终得到[[2,4], [6,7], [8,12]],也就是按每个区间的起始值排序的效果。
- 子元素
- 如果你要取整个
intervals大列表的第一个元素,写法是intervals[0],和这里的lambda形参x完全是两个不同的指代对象。
内容的提问来源于stack exchange,提问作者Justin Yoon
相关产品推荐
相关产品推荐

