python3 sorted 如何实现自定义排序标准


Posted in Python onMarch 12, 2020

在 python2 中,如果想要自定义评价标准的话,可以这么做

def cmp(a, b):
 # 如果逻辑上认为 a < b ,返回 -1
 # 如果逻辑上认为 a > b , 返回 1
 # 如果逻辑上认为 a == b, 返回 0 
 pass

a = [2,3,1,2]
a = sorted(a, cmp)

但是在 python3 中,cmp 这个参数已经被移除了,那么在 python3 中应该怎么实现 python2 的 cmp 功能呢?

import functools
def cmp(a, b):
  if b < a:
    return -1
  if a < b:
    return 1
  return 0
a = [1, 2, 5, 4]
print(sorted(a, key=functools.cmp_to_key(cmp)))

上面这个方法实现了降序排列,因为 -1 代表我们逻辑上认为 a<b ,而实际上 b<a 。

追溯 cmp_to_key 的源码,发现是这样的

def cmp_to_key(mycmp):
  """Convert a cmp= function into a key= function"""
  class K(object):
    __slots__ = ['obj']
    def __init__(self, obj):
      self.obj = obj
    def __lt__(self, other):
      return mycmp(self.obj, other.obj) < 0
    def __gt__(self, other):
      return mycmp(self.obj, other.obj) > 0
    def __eq__(self, other):
      return mycmp(self.obj, other.obj) == 0
    def __le__(self, other):
      return mycmp(self.obj, other.obj) <= 0
    def __ge__(self, other):
      return mycmp(self.obj, other.obj) >= 0
    __hash__ = None
  return K

返回的是一个类,在 sorted 内部,类接收一个参数构造一个实例,然后实例通过重载的方法来进行比较。

k1 = K(1)
k2 = K(2)

# 问题,k1,k2 谁是 self,谁是 other
# k1 是 self, k2 是 other
print(k1 < k2)

补充知识:Python sorted--key参数用法

sorted(iterable[, key][, reverse])

从 iterable 中的项目返回新的排序列表。

有两个可选参数,必须指定为关键字参数。

key 指定一个参数的函数,用于从每个列表元素中提取比较键:key=str.lower。默认值为 None (直接比较元素)。

reverse 是一个布尔值。如果设置为 True,那么列表元素将按照每个比较反转进行排序。

示例:创建由元组构成的列表:a = [('b',3), ('a',2), ('d',4), ('c',1)]

按照第一个元素排序

sorted(a, key=lambda x:x[0])

>>> [('a',2),('b',3),('c',1),('d',4)]

按照第二个元素排序

sorted(a, key=lambda x:x[1])

>>> [('c',1),('a',2),('b',3),('d',4)]

key = lambda x:x[?] 是固定写法,x其实可以为任意值。

以上这篇python3 sorted 如何实现自定义排序标准就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Tkinter GUI编程入门介绍
Mar 10 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
Python三级目录展示的实现方法
Sep 28 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
python中for in的用法详解
Apr 17 Python
python实现计算图形面积
Feb 22 Python
进行数据处理的6个 Python 代码块分享
Apr 06 Python
Python dict和defaultdict使用实例解析
Mar 12 #Python
Python数据结构dict常用操作代码实例
Mar 12 #Python
Python基于类路径字符串获取静态属性
Mar 12 #Python
对python中return与yield的区别详解
Mar 12 #Python
python 子类调用父类的构造函数实例
Mar 12 #Python
python3中sorted函数里cmp参数改变详解
Mar 12 #Python
Python实现子类调用父类的初始化实例
Mar 12 #Python
You might like
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
js实现碰撞检测
2021/01/29 Javascript
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python实现rsa加密实例详解
2017/07/19 Python
python基于ID3思想的决策树
2018/01/03 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
公安机关纪律作风整顿剖析
2014/10/10 职场文书
化工见习报告范文
2014/10/31 职场文书
董事长开业致辞
2015/07/29 职场文书
解析MySQL binlog
2021/06/11 MySQL
openstack中的rpc远程调用的方法
2021/07/09 Python
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android