在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
我读到了包装器函数,它将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,ASN4EJI出来的callKey()作为4,N,EJIW1AW出来的callKey()作为1,W,AWna1a出来的callKey()作为1,NA,A