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编写的com组件发生R6034错误的原因与解决办法
Apr 01 Python
跟老齐学Python之Import 模块
Oct 13 Python
python发送邮件功能实现代码
Jul 15 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python装饰器知识点补充
May 28 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Django import export实现数据库导入导出方式
Apr 03 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
十个Python自动化常用操作,即拿即用
May 10 Python
python利用while求100内的整数和方式
Nov 07 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
基于php验证码函数的使用示例
2013/05/03 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
Python使用MONGODB入门实例
2015/05/11 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
高效使用Python字典的清单
2018/04/04 Python
大学毕业生自我鉴定
2013/11/05 职场文书
办公室文书岗位职责
2013/12/16 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
python多线程方法详解
2022/01/18 Python
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python