关于Python的多重排序

Python预置的list.sort()、sorted()方法可实现各种数组的排序,但支持的只限于一个key,如果要多重排序,目前所知的方法只有自定义了。

Help on built-in function sorted in module __builtin__:

sorted(...)

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

查看sorted的帮助可知,cmp参数在第二个位置,不过一般都以kwargs的形式显式写出。

关于cmp,cmp定义的函数接收源数组中相邻的两个元素,在比较大小后分别返回负值、0或正值,分别代表第一个值小于、等于或大于第二个值,然后再按照key和reverse的设定去进行排序。

>>> a=list(range(10))
>>> a.reverse()    # reverse为on place方法
>>> a
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a.sort(cmp=lambda a,b: a-b)    # a-b < 0  默认reverse为False,升顺排序,结果为正常顺序
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.sort(cmp=lambda a,b: b-a)    # b-a > 0  lambda返回正值,认为a > b,按照“升顺”排序,实际结果为降序
>>> a                              # sort同样是on place方法
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> 

对于多重排序,可利用cmp方法,分别定义key的优先级,以及排序方式,达到多重、独立顺序的排序方式实现。

代码如下:

d1 = {1:23, ‘b‘: 62}
d2 = {1:24, ‘b‘: 2}
d3 = {1:23, ‘b‘: 54}
d4 = {1:23, ‘b‘: 1}
d5 = {1:01, ‘b‘: 9}
d6 = {1:23, ‘b‘: 32}
d7 = {1:05, ‘b‘: 33}
d8 = {1:39, ‘b‘: 100}

li = [d1, d2, d3, d4, d5, d6, d7, d8]

def cmpf(a, b, key1, key2):
     if (a[key1] != b[key1]):
             return a[key1] - b[key1]
     else:
             return a[key2] - b[key2]

def rcmpf(a, b, key1, key2):
     if (a[key1] != b[key1]):
             return b[key1] - a[key1]
     else:
             return a[key2] - b[key2]

# key1、key2均为升序
sorted(li, cmp=lambda a,b: cmpf(a, b, 1, ‘b‘))

# key1降序、key2升序
sorted(li, cmp=lambda a,b: rcmpf(a, b, 1, ‘b‘))

执行结果如下:

>>> sorted(li, cmp=lambda a,b: cmpf(a, b, 1, ‘b‘))
[{1: 1, ‘b‘: 9}, {1: 5, ‘b‘: 33}, {1: 23, ‘b‘: 1}, {1: 23, ‘b‘: 32}, {1: 23, ‘b‘: 54}, {1: 23, ‘b‘: 62}, {1: 24, ‘b‘: 2}, {1: 39, ‘b‘: 100}]
>>>
>>> sorted(li, cmp=lambda a,b: rcmpf(a, b, 1, ‘b‘))
[{1: 39, ‘b‘: 100}, {1: 24, ‘b‘: 2}, {1: 23, ‘b‘: 1}, {1: 23, ‘b‘: 32}, {1: 23, ‘b‘: 54}, {1: 23, ‘b‘: 62}, {1: 5, ‘b‘: 33}, {1: 1, ‘b‘: 9}]
>>> 

可以看到混合排序结果正常。

PS:按照预想,这种方式应该适用于所有可以指定多个key的数据结构,不过仍待验证。

时间: 2024-10-19 14:35:57

关于Python的多重排序的相关文章

Python复杂多重排序

1. cmp函数是python自带的函数,用于比较两个参数哪个大哪个小 print cmp(2, 3) # -1 print cmp(2, 1) # 1 print cmp(2, 2) # 0 如果第一个参数比第二个小,就返回-1,两个元素相等,返回0,否则返回1 2.所以就可以利用这个函数来自定义自己的比较规则 def cmp_country_size(country1, country2): alist = ['美国', '中国', '加拿大', '俄罗斯'] return cmp(alis

Python:如何排序(sort)

一.前言 Python的列表(list)有两个排序方法: 一种是内建的list.sort()方法,可以直接改变列表的内容: >>> list1 = [9,8,7,6,5] >>> list1.sort() >>> list1 [5, 6, 7, 8, 9] 另一个内建函数是sorted(),它的特点是不改变原列表的内容,而是根据一个可迭代对象建立一个新的列表: >>> list2 = [4,3,2,1] >>> li

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

Python学习——数据排序方法

Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2,6,432,78,43,22,896,42,677,12] >>> data1.sort() >>> data1 #原来的顺序被替换 [2, 4, 6, 12, 22, 42, 43, 78, 432, 677, 896] 2. 复制排序:采用sorted()内置函数,按照

从零开始学_JavaScript_系列(十一)——dojo(4)(GRID表格进阶:格式化、style、数据获取、多重排序、点击事件)

如果没有阅读过gridx表格的基本运用教程,建议先阅读这篇(4天点击量已经接近5k): http://blog.csdn.net/qq20004604/article/details/51170919 里面很详细的说明了gridx表格的创建,常用模块,和基本使用. 如果没有接触过dojo,建议阅读: http://blog.csdn.net/qq20004604/article/details/51028702 里面介绍了如何加载dojo. 关于dojo的下载,请查看: https://dojo

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

Python实现八大排序算法

Python实现八大排序算法,具体内容如下 1.插入排序描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中. 代码实现 def insert

Python应用——自定义排序全套方案

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的这篇文章和大家聊聊Python当中的排序,和很多高级语言一样,Python封装了成熟的排序函数.我们只需要调用内部的sort函数,就可以完成排序.但是实际场景当中,排序的应用往往比较复杂,比如对象类型,当中有多个字段,我们希望按照指定字段排序,或者是希望按照多关键字排序,这个时候就不能简单的函数调用来解决了. 字典排序 我们先来看下最常见的字典排序的场景,假设我们有一个字典的数组,字典内有多个字段.我们希望能够根据字典当中的某一个

关于python中sort排序的一个简单问题:

最近有小伙伴私聊问了一些类似的问题,就是关于python的sort排序的问题: a = [1, 0, 4, 0, 2, 3] a.sort(key=bool) print(a) 输出结果: [0, 0, 1, 4, 2, 3] 就是对这个排序的有点不太理解,为什么是[0, 0, 1, 4, 2, 3],不应该按升序来的吗?之所以产生这个误区,是因为对这个sort理解还不够,我之前也写过一篇关于sort排序的实现,里面简单的阐述原理,并且也实现了demo.我们再来回到这个问题上:a.sort(ke