在Python 2.x中,我可以将自定义函数传递给sorted和.sort函数
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Run Code Online (Sandbox Code Playgroud)
因为,在我的语言中,配偶带有这个命令
"k","kh",....,"ht",..."h",...,"a"
Run Code Online (Sandbox Code Playgroud)
但在Python 3.x中,看起来我无法传递cmp
关键字
>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function
Run Code Online (Sandbox Code Playgroud)
有没有其他选择,还是我应该编写自己的排序函数?
注意:我通过使用"k","kh"等进行了简化.实际字符是Unicodes甚至更复杂,有时元组前后有元音,我已经完成了自定义比较功能,所以那部分还可以.唯一的问题是我无法将自定义比较函数传递给sorted或.sort
来自python wiki:
In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__ methods).
我不明白为什么在py3.0中删除cmp的原因
考虑这个例子:
>>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
现在考虑这个版本(推荐并与3.0兼容):
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return …
Run Code Online (Sandbox Code Playgroud) 我读到了包装器函数,它将cmp样式比较转换为Python 3中的键样式比较,其中删除了cmp功能.
我有一点时间围绕Python3直键样式sorted()函数的方式,至少据我所知,只有一个为键指定的项目,可以让你正确比较,例如,两个IP用于订购.或火腿电话.
而对于cmp,它没有任何东西:sorted()和sort()用两个ips调用你,你查看了相应的部分,完成了你的决定.
def ipCompare(dqA,dqB):
...
ipList = sorted(ipList,cmp=ipCompare)
Run Code Online (Sandbox Code Playgroud)
火腿无线电呼叫也是如此.排序不是字母; 电话通常是字母+数字+字母; 第一个排序优先级是数字部分,然后是第一个字母,然后是最后一个字母(s.)
使用cmp ......没有汗水.
def callCompare(callA,callB):
...
hamlist = sorted(hamlist,cmp=callCompare)
Run Code Online (Sandbox Code Playgroud)
使用Python3 ...没有经过包装器的箍跳......并且通过了一个项目......我想......怎么能这样做?
如果绝对需要包装器...那么为什么首先在Python3中删除cmp?
我确定我错过了什么.我只是看不到它.:/
好的,现在我知道我错过了什么.解决方案IPs
在下面的答案中给出.这是我提出的用于排序公共前缀,区域,后缀形式的火焰调用的密钥:
import re
def callKey(txtCall):
l = re.split('([0-9]*)',txtCall.upper(),1)
return l[1],l[0],l[2]
hamList = ['N4EJI','W1AW','AA7AS','na1a']
sortedHamList = sorted(hamList,key=callKey)
Run Code Online (Sandbox Code Playgroud)
sortedHamList
结果是 ['na1a','W1AW','N4EJI','AA7AS']
详情:
AA7AS
出来的callKey()
作为7,AA,AS
N4EJI
出来的callKey()
作为4,N,EJI
W1AW
出来的callKey()
作为1,W,AW
na1a
出来的callKey()
作为1,NA,A