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

问题描述 投票:5回答:2

我正在使用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中处理此错误的帮助。

python sorting python-3.x python-2.x cmp
2个回答
1
投票

您应该尝试将cmp函数重写为key函数。在这种情况下,您似乎可以仅返回one元素的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_to_key()参数,但要考虑到这不是理想的解决方案(它会影响性能)。


0
投票

来自python文档

© www.soinside.com 2019 - 2024. All rights reserved.