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程序设计入门(5)类的使用简介
Jun 16 Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
python判断windows系统是32位还是64位的方法
May 11 Python
python&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
Python加载带有注释的Json文件实例
May 23 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
pycharm 关掉syntax检查操作
Jun 09 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
基于Python实现nc批量转tif格式
Aug 14 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的引用计数机制
2013/06/14 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
区分JS中的undefined,null,&quot;&quot;,0和false
2007/03/08 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Python urlopen 使用小示例
2008/09/06 Python
Python实现CET查分的方法
2015/03/10 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
matplotlib实现区域颜色填充
2019/03/18 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python中return的返回和执行实例
2019/12/24 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
美国网上订购鲜花:FTD
2016/09/23 全球购物
物流司机岗位职责
2013/12/28 职场文书
开业庆典主持词
2014/03/21 职场文书
大学生简历求职信
2014/06/24 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
住房抵押登记委托书
2014/09/27 职场文书
2015年电教工作总结
2015/05/26 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS