前言 python中对集合执行排序是非常简单。 那希望按文本长度排序,把长的文本排到后面,如何做到? 元素是复杂的结构,比如字典。如何按分数降序排序? 需要同时对多个字段排序呢? 对多个字段,应用不同的升降序排序呢? 最后,怎么定义出类似pandas的排序函数? 今天我将带大家闯过这些关卡,当然也会讲解其中的关键技巧。超级干货,一键三连再观看 视频版本在这里第一关,普通元素排序。 这里主要为了简单了解sorted函数的使用。 第一个参数指定排序的集合 参数reverse可以指定是否降序第二关,把文本较长的放在后面 通过参数key,可以指定排序规则。 这里指定函数len,就可以做到按文本长度排序。 为了帮助大家理解它的过程,我把数据变成表格。 行3:设置sorted函数的参数key,相当于为表格添加辅助列,计算出名字的长度值。 行4:对key列排序 最后取出名字列 后面,我们会看到使用自定义函数指定更复杂的规则第三关,复杂结构排序 当python无法确定元素的排序规则时,就需要设置参数key。 这个例子中,需要从每个字典中取出分数, 设置参数key为一个简单的lambda表达式。 表达式中的x,就是列表中的每个字典。 设置参数reverse指定为降序第四关,多列排序 这里需要同时对分数和年龄进行降序排序。 同样,需要设置参数key,但lambda表达式中到底要返回什么呢? 此时,我们可以利用元组的特性,每个元组比较的时候,都会从左到右顺序比较。 可以看到结果中的这两行,同样的分数,年龄高的被排到前面第五关,多列,不同升降序 这一关最难了。 这里与前一关唯一不同的是,当分数相同时,需要把年龄小的排到前面。但是我们无法使用上一关的代码做到。这是因为元组的比较规则是固定的。 要解决这个问题,我们需要简单了解python稳定排序的意思。 首先,只对分数进行排序。 现在只看这两行记录。可以看到,不管是升序还是降序排序,排序规则中的值,如果无法分出高低时,那么python会确保这两笔记录,仍然保持原来的前后顺序。 这就是稳定排序的意义所在。 利用稳定排序的特性,我们可以把规则反方向执行。 首先,只对年龄执行升序排序。 注意分数相同的2笔记录,他们现在的前后次序是符合要求的。 行13:对结果再次按分数降序排序。 由于排序稳定性,年龄小的记录不会因为这次排序,改变它的位置。 因此,当需要多列应用不同的升降序规则时,要反方向划分多个步骤执行 这也太麻烦了。熟悉pandas的小伙伴,一定会选择利用表格排序做到要求。可以看到通过一个参数ascending,指定多个不同升降序。多方便呀 其实,我们也可以用自定义函数做到。 使用的时候很简单: 这里的参数key之所以要求使用itemgetter函数,是为了可以兼容其他对象的排序。以后有机会再展开讲解这方面的应用吧。 私信python,获取源码。你的点赞是我写作的动力,记得一键三连 推荐阅读Python进阶系列:Python遍历的秘密Python进阶系列:细讲Python推导式Python重要知识,生成器的威力每日一点,带你入门Python星号拆包