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 调用HBase的简单实例
Dec 18 Python
Python使用sorted排序的方法小结
Jul 28 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Python是怎样处理json模块的
Jul 16 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 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 GeoIP的使用教程
2011/03/09 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
js实现文字截断功能
2016/09/14 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
跟老齐学Python之for循环语句
2014/10/02 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
火车的故事教学反思
2014/02/11 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
大学生学习计划书
2014/09/15 职场文书
2014年资料员工作总结
2014/11/18 职场文书
草房子读书笔记
2015/06/29 职场文书
诚信考试主题班会
2015/08/17 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript