In Python 3 können Sie eine Vergleichsfunktion nicht mehr an eine sortierte Funktion übergeben. In Python 3.2 können Sie jedoch functools.cmp_to_key verwenden, um dasselbe zu tun wie eine Vergleichsfunktion an eine sortierte Funktion zu übergeben. Lassen Sie uns einige Beispiele schreiben.
Schreiben wir zunächst ein Beispiel, das Ganzzahlen nach Zeichenfolgen vergleicht und sortiert.
python
from functools import cmp_to_key
def cmp(a, b):
if a == b: return 0
return -1 if a < b else 1
def cmpstr(a, b):
return cmp(str(a), str(b))
def main():
xs = [4, 90, -9, 12, 42]
print(sorted(xs, key=cmp_to_key(cmpstr)))
main()
Dies ist das Ausführungsergebnis.
[-9, 12, 4, 42, 90]
Das Ergebnis des Größenvergleichs gibt -1, 0 oder 1 zurück. Gibt -1 zurück, wenn weniger, 0, wenn gleich, 1, wenn größer.
Nur in diesem Beispiel ist das Schreiben von "sortiert (xs, key = str)" dasselbe.
Jetzt, da ich weiß, wie man functools.cmp_to_key
benutzt, werde ich die Sorte ausprobieren, die ich wirklich machen wollte. Ich habe eine Liste von Tupeln mit zwei Elementen und möchte diese Liste sortieren. Die Vergleichsmethode sortiert das zweite Element des Taples in aufsteigender Reihenfolge und, wenn das zweite Element gleich ist, in absteigender Reihenfolge des ersten Elements. Die Vergleichsfunktion ist wie folgt.
python
from functools import cmp_to_key
def cmp(a, b):
if a == b: return 0
return -1 if a < b else 1
def cmptuple(a, b):
return cmp(a[1], b[1]) or cmp(b[0], a[0])
def main():
xs = [(4, 90), (-9, 12), (42, 12), (100, 12), (1, 1), (-123, 1)]
print(sorted(xs, key=cmp_to_key(cmptuple)))
main()
Dies ist das Ausführungsergebnis.
[(1, 1), (-123, 1), (100, 12), (42, 12), (-9, 12), (4, 90)]