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进程通信之匿名管道实例讲解
Apr 11 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
SVM基本概念及Python实现代码
Dec 27 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
Python多层装饰器用法实例分析
Feb 09 Python
python语言基本语句用法总结
Jun 11 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 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
缅甸的咖啡简史
2021/03/04 咖啡文化
PHP include_path设置技巧分享
2011/07/03 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php返回json数据函数实例
2014/10/09 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Django实现学员管理系统
2019/02/26 Python
python字典的值可以修改吗
2020/06/29 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
波兰珠宝品牌:YES
2019/08/09 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
迟到检讨书5000字
2014/01/31 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS