python cmp函数比较字典_Python:使用自定义比较器排序一系列字典

选项1:

key=lambda d:(d['rank']==0,d['rank'])

选项二:

key=lambda d:d['rank'] if d['rank']!=0 else float('inf')

演示:

“I’d like to sort it by the rank values,ordering as follows: 1-2-3-4-0-0-0.” –original poster

>>> sorted([0,1,2,3,4],key=lambda x:(x==0,x))

[1,4,0]

>>> sorted([0,key=lambda x:x if x!=0 else float('inf'))

[1,0]

补充评论:

“Please could you explain to me (a Python novice) what it’s doing? I can see that it’s a lambda,which I know is an anonymous function: what’s the bit in brackets?” – OP comment

索引/切片符号:

itemgetter(‘rank’)与lambda x相同:x [‘rank’]与函数相同:

def getRank(myDict):

return myDict['rank']

[…]被称为索引/切片符号,请参见Explain Python’s slice notation – 另请注意,someArray [n]是许多编程语言中的常用符号,用于索引,但可能不支持[start:end]或[start :端:步骤].

key = vs cmp = vs丰富的比较:

至于发生了什么,有两种常用的方法来指定排序算法的工作原理:一种是关键功能,另一种是使用一个cmp函数(现在在python中已经不再使用,但是更多功能).而cmp函数允许您任意指定两个元素应如何比较(输入:a,b;输出:a

rich comparison operators,或者只是实现其中一个和__eq__并使用

@functools.total_ordering decorator.这将导致该类的对象在使用比较运算符时使用自定义逻辑(例如x = Record(name =’Joe’,rank = 12)y = Record(…)x< y);由于排序(...)函数使用

key=lambda d: (not 'rank' in d,d['rank'])

方案2具有不同的方案:

key=lambda d: d.get('rank',float('inf'))

sidenote:依​​靠python中的无穷大的存在几乎是一个黑客的边界,提出任何提到的解决方案(元组,对象比较),Lev的filter-then-concatenate solution,甚至可能是稍微复杂的cmp solution(由威尔逊打字),更多可泛化到其他语言.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值