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端口扫描系统实现方法
Nov 19 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
Python实现批量下载图片的方法
Jul 08 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
Python模拟用户登录验证
Sep 11 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
python 自动刷新网页的两种方法
Apr 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
CentOS安装php v8js教程
2015/02/26 PHP
php日期操作技巧小结
2016/06/25 PHP
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Python使用type动态创建类操作示例
2020/02/29 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
python实现取余操作的简单实例
2020/08/16 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
工作总结与自我评价
2014/09/18 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
六五普法学习心得体会
2016/01/21 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
教你怎么用Python操作MySql数据库
2021/05/31 Python