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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python数据库的连接实现方法与注意事项
Feb 27 Python
python中执行shell的两种方法总结
Jan 10 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
python编辑用户登入界面的实现代码
Jul 16 Python
python3.6的venv模块使用详解
Aug 01 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
python中如何使用insert函数
Jan 09 Python
TensorBoard 计算图的查看方式
Feb 15 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
如何表示python中的相对路径
Jul 08 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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安全配置
2006/10/09 PHP
PHP语法速查表
2007/01/02 PHP
PHP静态新闻列表自动生成代码
2007/06/14 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
namespace.js Javascript的命名空间库
2011/10/11 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
AI人工智能 Python实现人机对话
2017/11/13 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
社区国庆节活动方案
2014/02/05 职场文书
政风行风整改方案
2014/10/25 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
python实现三次密码验证的示例
2021/04/29 Python