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利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
Python中scatter函数参数及用法详解
Nov 08 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
基于Python快速处理PDF表格数据
Jun 03 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
python音频处理的示例详解
Dec 23 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 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 无限级缓存的类的扩展
2009/03/16 PHP
php内存缓存实现方法
2015/01/24 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
php常用的工具开发整理
2019/09/26 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python实现telnet客户端的方法
2015/04/15 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
行政人事专员岗位职责
2014/03/05 职场文书
公司应聘求职信
2014/06/21 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
党支部意见范文
2015/06/02 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL