相关疑难解决方法(0)

如何在Python 3中使用自定义比较函数?

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 sorting python-3.x

85
推荐指数
4
解决办法
5万
查看次数

为什么在Python3.0中从排序/排序中删除了cmp参数?

来自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)

python sorting object cmp

36
推荐指数
2
解决办法
1万
查看次数

Python3样式排序 - 旧密钥机制中的旧cmp方法功能?

我读到了包装器函数,它将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

python sorting

2
推荐指数
1
解决办法
984
查看次数

标签 统计

python ×3

sorting ×3

cmp ×1

object ×1

python-3.x ×1