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的web框架中编写创建日志的程序的教程
Apr 30 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python 正则表达式的高级用法
Dec 04 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
Python与R语言的简要对比
Nov 14 Python
Python编程求质数实例代码
Jan 31 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
PyCharm如何导入python项目的方法
Feb 06 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 Python
详解Python魔法方法之描述符类
May 26 Python
利用Python判断你的密码难度等级
Jun 02 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
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
历史专业个人求职信范文
2013/12/07 职场文书
标准化管理实施方案
2014/02/25 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
2015年采购部工作总结
2015/04/23 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
就业指导讲座心得体会
2016/01/15 职场文书