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

3

代わりcmpに、関数をキー関数に書き換えてみてください。この場合、 1 つの要素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 に答える