类型错误:'cmp'是该函数的无效关键字参数。

16

我正在使用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个回答

11

来自Python文档

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

该函数在Python 3中也可用。

只需使用cmp_to_key将您的cmp函数包装起来即可。

from functools import cmp_to_key

...

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

3

您应该尝试将您的cmp函数改写为一个key函数。在这种情况下,看起来您可以仅返回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()实用函数来适应您的cmp参数,但请注意这不是一个理想的解决方案(它会影响性能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接