ewi*_*ulu 5 python sorting cmp python-2.x python-3.x
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我真的很感激如何在Python3中处理这个错误.
小智 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)...
Run Code Online (Sandbox Code Playgroud)
您应该尝试将您的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)
Run Code Online (Sandbox Code Playgroud)
我冒昧地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)
Run Code Online (Sandbox Code Playgroud)
这个函数在 Python 2 和 3 中都可以工作:
sorted(zip(tracks, self.mapping[idx][track_selection[-1]].iloc[0]),
key=lambda x: my_key(x[1]))
Run Code Online (Sandbox Code Playgroud)
如果不能,您可以使用cmp_to_key()效用函数来调整您的cmp参数,但请考虑到这不是一个理想的解决方案(它会影响性能)。