自定义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)

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JVM: GC过程总结(minor GC 和 Full GC)「建议收藏」

    一minorGC和FullGC区别新生代GC(MinorGC):指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快。老年代GC(MajorGC/FullGC):指发生在老年代的GC,出现了MajorGC经常会伴随至少一次的MinorGC(并非绝对),MajorGC的速度一般会比MinorGC的慢10倍以上。二minorGC过程详解1在初始阶段,新创建的对象被分配到Eden区,survivor的两块空间都为空。

    2022年4月12日
    39
  • 后缀数组的学习(四):SA数组实现代码分析

    后缀数组的学习(四):SA数组实现代码分析

    2021年8月20日
    51
  • JAVA实现贪吃蛇游戏

    JAVA实现贪吃蛇游戏最近在学GUI,然后又有读者希望我写一下相关的实战。刚好我又在B站上找到了一个关于GUI的学习视频,然后里面又刚好有这个实战,我便写了下来。注:代码来源为B站的一个up主:狂神。游戏主启动类:importjavax.swing.*;//游戏主启动类publicclassstartGame{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();frame..

    2022年6月22日
    26
  • Java之父:C语言是撑起一切的基石[通俗易懂]

    Java之父:C语言是撑起一切的基石[通俗易懂]为了忘却的纪念:无论任何领域,伟大的人物,永远不死!2011年10月9日,患有前列腺癌和心脏病的C语言之父丹尼斯·里奇离世。不知不觉,这位伟大的程序员已经离开我们已经有6年了。有人曾说,没有C语言之父,就没有乔布斯。C语言之父影响力其实不止这些。毫不夸张的说,没有C语言之父,就没有微软的Windows10和SurfaceBook,也没有安卓智能手机

    2022年7月8日
    24
  • 【STM32】NVIC中断优先级管理(中断向量表)

    【STM32】NVIC中断优先级管理(中断向量表)STM32F1xx官方资料:《STM32中文参考手册V10》-第9章中断和事件Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F10…

    2022年5月28日
    287
  • 《王道计算机网络》学习笔记总目录+思维导图

    本篇文章是对《2021王道计算机网络》所有知识点的笔记总结归档,会一直更新下去之后我也会写操作系统、计算机网络、数据结构与算法、Java、Linux等底层和应用层的技术文章,并总结目录希望在自己可以复习的同时,也能将这些知识点总结归纳分享给大家欢迎大家关注我的个人博客网站:www.bithachi.cn,一起交流学习。文章总目录:第1章计算机网络体系结构1.1计算机网络概述1….

    2022年4月6日
    103

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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