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发送伪造的arp请求
Jan 09 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
django使用html模板减少代码代码解析
Dec 12 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
解决python存数据库速度太慢的问题
Apr 23 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 Python
python脚本框架webpy模板控制结构
Nov 20 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
Content-type 的说明
2006/10/09 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php连接mysql数据库
2017/03/21 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
php报错502badgateway解决方法
2019/10/11 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
js对象数组按属性快速排序
2011/01/31 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
跟老齐学Python之??碌某?? target=
2014/09/12 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
商业活动邀请函
2014/02/04 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
永不妥协观后感
2015/06/10 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
修辞手法有哪些?
2019/08/29 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
解析目标检测之IoU
2021/06/26 Python