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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
django Admin文档生成器使用详解
Jul 22 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
Python自定义sorted排序实现方法详解
Sep 18 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获取当前完整URL地址的函数
2014/12/21 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
js三种排序算法分享
2012/08/16 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
node中的session的具体使用
2018/09/14 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
python关闭占用端口方式
2019/12/17 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
Django如何使用redis作为缓存
2020/05/21 Python
Python Http请求json解析库用法解析
2020/11/28 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
门卫工作岗位职责
2013/12/17 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技