In Python 2.x konnte ich benutzerdefinierte Funktionen an sortierte und sortierte Funktionen übergeben
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Weil in meiner Sprache Konsonanten mit dieser Reihenfolge kommen
"k","kh",....,"ht",..."h",...,"a"
In Python 3.x konnte ich jedoch kein cmp
Schlüsselwort übergeben
>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function
Gibt es Alternativen oder sollte ich auch meine eigene sortierte Funktion schreiben?
Hinweis: Ich habe durch die Verwendung von "k", "kh" usw. vereinfacht. Tatsächliche Zeichen sind Unicodes und noch komplizierter. Manchmal gibt es Vokale vor und nach Konsonenten. Ich habe eine benutzerdefinierte Vergleichsfunktion durchgeführt. Dieser Teil ist also in Ordnung. Das einzige Problem ist, dass ich meine benutzerdefinierte Vergleichsfunktion nicht an sortiert oder .sort übergeben konnte
sorted(x)
?Antworten:
Verwenden Sie das
key
Argument (und befolgen Sie das Rezept zum Konvertieren Ihrer altencmp
Funktion in einekey
Funktion).functools
hat eine Funktion,cmp_to_key
die unter docs.python.org/3.6/library/functools.html#functools.cmp_to_key erwähnt wirdquelle
< > =
an Middle Man übergebe, da meine ursprüngliche benutzerdefinierte Sortierung in C geschrieben ist und eine Geschwindigkeit von ungefähr 1 / 2x hat Standardsortierung.timeit
es?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
gibt TypeError an: 'cmp' ist ein ungültiges Schlüsselwortargument für diese Funktion in Python 3.2 :(Verwenden Sie das
key
Schlüsselwort und functools.cmp_to_key, um Ihre Vergleichsfunktion zu transformieren:quelle
Anstelle eines Zolls () benötigen Sie eine Funktion, die jedes Wort in etwas übersetzt, das Python bereits sortieren kann. Sie könnten beispielsweise jedes Wort in eine Liste von Zahlen übersetzen, wobei jede Zahl darstellt, wo jeder Buchstabe in Ihrem Alphabet vorkommt. Etwas wie das:
Da Ihre Sprache mehrstellige Buchstaben enthält, muss Ihre custom_key-Funktion natürlich komplizierter sein. Das sollte Ihnen jedoch die allgemeine Idee geben.
quelle
Ein vollständiges python3 cmp_to_key Lambda-Beispiel:
Vergleiche mit der allgemeinen Objektsortierung:
quelle
Ich weiß nicht, ob dies helfen wird, aber Sie können das
locale
Modul überprüfen . Es sieht so aus, als könnten Sie das Gebietsschema auf Ihre Sprache einstellen undlocale.strcoll
Zeichenfolgen anhand der Sortierregeln Ihrer Sprache vergleichen.quelle
Verwenden Sie
key
stattdessen das Argument. Es wird eine Funktion verwendet, die den zu verarbeitenden Wert übernimmt und einen einzelnen Wert zurückgibt, der den Schlüssel zum Sortieren angibt.quelle
TypeError: customsort() takes exactly 2 positional arguments (1 given)