TypeError:' cmp'是此函数的无效关键字参数

时间:2015-02-13 15:19:25

标签: python sorting python-3.x python-2.x cmp

我正在使用Python3,但该脚本与此版本不兼容,我遇到了一些错误。现在我对cmp参数有疑问。这是代码

def my_cmp(x,y):
    counter = lambda x, items: reduce(lambda a,b:a+b, [list(x).count(xx) for xx in items])
    tmp =  cmp(counter(x, [2,3,4,5]), counter(y, [2,3,4,5]))
    return tmp if tmp!=0 else cmp(len(x),len(y)) 

for i, t in enumerate([tmp[0] for tmp in sorted(zip(tracks, self.mapping[idx][track_selection[-1]].iloc[0]), cmp=my_cmp, key=lambda x:x[1])]):
    img[i,:len(t)] = t

我真的很感激如何在Python3中处理这个错误。

2 个答案:

答案 0 :(得分:1)

您应该尝试将cmp功能重写为功能。在这种情况下,您只需返回一个元素的counter()函数输出:

def my_key(elem):
    counter = lambda x, items: sum(list(x).count(xx) for xx in items)
    return counter(elem, [2, 3, 4, 5]), len(elem)

我冒昧地用reduce(...)函数替换sum()代码,这是一种更加紧凑和可读的方法来对一系列整数求和。

以上也将首先按counter()的输出排序,并在出现平局的情况下按每个已排序元素的长度排序。

counter函数效率极低;我在这里使用Counter()课程:

from collections import Counter

def my_key(elem):
    counter = lambda x, items: sum(Counter(i for i in x if i in items).values())
    return counter(elem, {2, 3, 4, 5}), len(elem)

此功能适用于Python 2和3:

sorted(zip(tracks, self.mapping[idx][track_selection[-1]].iloc[0]),
       key=lambda x: my_key(x[1]))

如果你不能,你可以使用cmp_to_key() utility function来调整你的cmp参数,但考虑到这不是一个理想的解决方案(它会影响性能)。

答案 1 :(得分:1)

来自python文档

  

在Python 2.7中,functools.cmp_to_key()函数已添加到   functools模块。

该功能在python 3中也可用。

只需用cmp_to_key包装您的cmp函数

from functools import cmp_to_key

...

...key=cmp_to_key(my_cmp)...