自定义Python排序函数比较方式

自定义Python排序函数比较方式当你想按自己的方式对数组元素进行排序时,我们需要自定义比较函数实现我们想实现的排序方式。例1以降序对数组进行排序>>>defcomp(x,y):…returny-x…>>>a=[1,8,4,5,2,7]>>>a.sort(comp)>>>a[8,7,5,4,2,1…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

当你想按自己的方式对数组元素进行排序时,我们需要自定义比较函数实现我们想实现的排序方式。
例1
以降序对数组进行排序

>>> def comp(x,y):
...     return y-x
... 
>>> a = [1,8,4,5,2,7]
>>> a.sort(comp)
>>> a
[8, 7, 5, 4, 2, 1]

Jetbrains全家桶1年46,售后保障稳定

例2

class Interval(object):
	def __init__(self, s=0, e=0):
		self.start = s
		self.end = e

intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
	t = Interval(l[0],l[1])
	intervals.append(t)

def printInterval(inter):
	print("[{}, {}]".format(inter.start,inter.end))

for l in intervals:
	printInterval(l)
# [[1,3],[15,18],[8,10],[2,6]]

def comp(it1, it2):
	return it1.start-it2.start

intervals.sort(comp)

for l in intervals:
	printInterval(l)
# [[1,3],[2,6],[8,10],[15,18]]

以上方法皆是python2的实现。python3下实现有所不同(以上方法python3下跑不通),因为python3 sorted取消了对cmp的支持,即python3没有cmp函数。

例2的python3实现

class Interval(object):
	def __init__(self, s=0, e=0):
		self.start = s
		self.end = e

intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
	t = Interval(l[0],l[1])
	intervals.append(t)

def printInterval(inter):
	print("[{}, {}]".format(inter.start,inter.end))

for l in intervals:
	printInterval(l)
def comp(it1):
	return it1.start

intervals.sort(key=comp)
# sorted(intervals,key=comp)

for l in intervals:
	printInterval(l)

在python3中,待比较元素x通过custom_key函数转化为Python能比较的值custom_key(x),进而再基于返回值进行排序。

python3 比较第二种方式
如果想和python2中一样定义比较函数,可以通过functools库中的cmp_to_key()函数将比较函数(comparison function)转化为关键字函数(key function)。
functools.cmp_to_key(func)函数将比较函数转化为关键字函数,与接受key function 的工具一同使用(如 sorted(), min(), max())。

from functools import cmp_to_key as ctk
class Interval(object):
	def __init__(self, s=0, e=0):
		self.start = s
		self.end = e

intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
	t = Interval(l[0],l[1])
	intervals.append(t)

def printInterval(inter):
	print("[{}, {}]".format(inter.start,inter.end))

for l in intervals:
	printInterval(l)
"""
Please note here.
"""
def comp(it1,it2):
	return it1.start-it2.start

intervals.sort(key=ctk(comp))
# sorted(intervals,key=comp)

for l in intervals:
	printInterval(l)

最后得到的结果和上面的代码是一样的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226750.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mybatis拦截器不能拦截哪个类_信号发生器的使用方法总结

    mybatis拦截器不能拦截哪个类_信号发生器的使用方法总结文章目录1.基础介绍1.1.核心对象1.2.执行过程2.实现步骤2.1.添加注解2.1.1.type2.1.2.method2.1.3.args2.2.方法实现2.2.1.intercept2.2.2.plugin2.2.3.setProperties3.代码示例MyBatis拦截器可以做的工作:SQL修改,分页操作,数据过滤,SQL执行时间性能监控等。1.基础介绍1.1.核心对象从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:Con

  • 历史拉链表「建议收藏」

    历史拉链表「建议收藏」使用UDW创建历史拉链表。介绍历史拉链表历史拉链表是一种数据模型,主要针对数据仓库设计中表存储数据的方式而定义的。**它记录一个事物从开始到当前状态的所有变化的信息。**拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。也就是说,对于表中的任何数据,不进行真正的删除,只记录操作和有效日期。流程其中,tmp0表有两个分区,表…

    2022年10月17日
  • 独立样本与配对样本t检验

    独立样本与配对样本t检验spss操作全力推荐医咖会这个医学网站,上面讲解非常齐全,下附链接:https://www.mediecogroup.com组间均值是否存在差异,使用t检验独立样本t检验1、需满足条件①、数据满足独立性、②、样本均数服从正态分布、③、两个总体方差齐,可选用两个样本均数比较的t检验2、进行判断①、逻辑上判断是否满足独立,②、数据量比较大时,一般可认为数据满足正态分布③、方差齐次…

  • Java解析XML文件

    Java解析XML文件1.DOM方式解析XMLDom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。2.SAX方式解析XML基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据3.JDOM方式解

  • ThinkPHP配置文件的加载

    ThinkPHP配置文件的加载

  • 打印列表从尾部到头部

    打印列表从尾部到头部

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号