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分治法定义与应用实例详解
Jul 28 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
10款最好的Python开发编辑器
Jul 03 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
Python random库使用方法及异常处理方案
Mar 02 Python
Python多线程多进程实例对比解析
Mar 12 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
如何使用python自带IDLE的几种方法
Oct 10 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
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
推荐dojo学习笔记
2007/03/24 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
Python入门篇之字典
2014/10/17 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
大学生物业管理求职信
2013/10/24 职场文书
项目经理岗位职责
2013/11/11 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python