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实现定时同步本机与北京时间的方法
Mar 24 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
python下10个简单实例代码
Nov 15 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
Python面向对象原理与基础语法详解
Jan 02 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
浅析matlab中imadjust函数
Feb 27 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
Python的logging模块基本用法
Dec 24 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
Linux文件系统类型
2012/09/16 面试题
装潢设计实习自我鉴定
2013/09/19 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
琅琊山导游词
2015/02/05 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
中秋节感想
2015/08/10 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
MySQL表的增删改查(基础)
2021/04/05 MySQL