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


相关推荐

  • mysql executenonquery_ExecuteNonQuery()返回值注意点

    mysql executenonquery_ExecuteNonQuery()返回值注意点查询某个表中是否有数据的时候,我用了ExecuteNonQuery(),并通过判断值是否大于0来判断数据的存在与否。结果与我所设想的很不一致,调试时才发现,其执行后返回的结果是-1,对此我很是不理解,回头查了下资料,如下显示:SqlCommand.ExecuteNonQuery方法对连接执行Transact-SQL语句并返回受影响的行数。备注:可以使用ExecuteNonQuery来…

  • executorservice和executor_source counter

    executorservice和executor_source counter1、创建一个WorkerThread类,表示执行任务publicclassWorkerThreadimplementsRunnable{ @Override publicvoidrun(){ System.out.println("当前时间:"+System.currentTimeMillis()+"线程名称:" +Thread.currentT…

  • gradle 打包命令(怎么在mac终端输入命令)

    Gradle终端命令给App打包估计好多兄弟们都习惯了用AndroidStudio和Eclipse的build直接对app进行打包,突然有一天领导让用Gradle打包,就措手不及了,我为大家附上方法:首先,需要有一个本地的Gradle,在此我附上网址,是我自己传到网盘上的,所以不是最新的,不影响使用gradle-2.4-all链接:http://pan.baidu.com/s/1nvRcDV7密

  • 安装VMtool_虚拟机没有安装VMware Tools

    安装VMtool_虚拟机没有安装VMware Tools安装VMTOOL工具1.VMtoolsVMtools顾名思义就是Vmware的一组工具。主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件、鼠标无缝切换、显示分辨率调整等,十分实用。2.先启动系统3.安装4.将安装包复制到桌面5.解压压缩包tar-zxvf*.tar.gz6.进入解压文件运行./vmware-install.pl7.安装完成选择yes,遇到选项回车。安装完成reboot。..

  • idea注册激活码破解方法

    idea注册激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • eclipse导入maven工程及maven的安装「建议收藏」

    eclipse导入maven工程及maven的安装「建议收藏」1、下载maven,解压。2、配置环境变量新建:M2_HOME:D:\indoorLocation\apache-maven-3.3.9Path:;%M2_HOME%\bin;3、验证:mvn-v,出现maven路径版本等信息说明maven安装成功4、配置maven本地仓库在路径D:\indoorLocation\apache-maven-3.3.9\conf下的setti

发表回复

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

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