13

我正在使用 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 中的此错误,我将不胜感激。

4

2 回答 2

8

来自 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)...
于 2019-10-09T23:33:59.303 回答
3

您应该尝试将您的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()实用函数来调整你的cmp论点,但考虑到这不是一个理想的解决方案(它会影响性能)。

于 2015-02-13T15:22:29.757 回答