Verwenden Sie localeund es ist String-Kollatierungsmethoden, um natürlich nach dem aktuellen Gebietsschema zu sortieren.
u0b34a0f6ae
Antworten:
519
Grundlegende Antwort:
mylist =["b","C","A"]
mylist.sort()
Dies ändert Ihre ursprüngliche Liste (dh sortiert an Ort und Stelle). Verwenden Sie die folgende sorted()Funktion, um eine sortierte Kopie der Liste zu erhalten, ohne das Original zu ändern :
for x in sorted(mylist):print x
Die obigen Beispiele sind jedoch etwas naiv, da sie das Gebietsschema nicht berücksichtigen und eine Sortierung nach Groß- und Kleinschreibung durchführen. Sie können den optionalen Parameter nutzen key, um eine benutzerdefinierte Sortierreihenfolge anzugeben (die Alternative cmpist eine veraltete Lösung, da sie mehrmals ausgewertet werden muss - keywird nur einmal pro Element berechnet).
So sortieren Sie nach dem aktuellen Gebietsschema unter Berücksichtigung sprachspezifischer Regeln ( cmp_to_keyist eine Hilfsfunktion von functools):
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll))==[u'aa', u'Ab', u'ad']
Letzte Anmerkung: Sie sehen Beispiele für die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung, bei denen die lower()Methode verwendet wird. Diese sind falsch, da sie nur für die ASCII-Teilmenge von Zeichen funktionieren. Diese beiden sind für nicht englische Daten falsch:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Guter Punkt. Ich werde mein aktuelles Beispiel unverändert lassen, da es für Anfänger wahrscheinlich einfacher ist, zu sehen, was passiert, aber ich werde dies in Zukunft berücksichtigen.
Eli Courtwright
1
Wenn jemand neugierig ist, kann die Leistung von list.sort () hier gefunden werden
Hari Ganesan
1
@BornToCode: 1- Ich weiß . Schauen Sie sich die Revision (2008) an, auf die mein Kommentar antwortet (mein Kommentar bezieht sich auf die unnötige Verwendung von Lambda). Das Sortieren von Nicht-ASCII-Zeichen ist ein großes separates Thema. PyICU könnte anstelle der auf dem Gebietsschema basierenden Lösung verwendet werden.
JFS
1
@Dmitry Dies liegt daran, dass Sie den Rückgabewert der aufgerufenen Sortierfunktion drucken [1, 2, 3].sort(). Wenn sort()die Liste an Ort und Stelle sortiert wird (dh die Liste direkt geändert wird), wird die sortierte Liste nicht zurückgegeben und es wird tatsächlich nichts zurückgegeben, sodass Ihre Druckanweisung gedruckt wird None. Wenn Sie Ihre Liste in einer Variablen gespeichert haben, z. B. xaufgerufen x.sort(), print(x)wird die sortierte Liste angezeigt.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll)==[u'aa', u'Ab', u'ad']# Without using locale.strcoll you get:assert sorted((u'Ab', u'ad', u'aa'))==[u'Ab', u'aa', u'ad']
Das vorherige Beispiel von mylist.sort(key=lambda x: x.lower())funktioniert gut nur für ASCII-Kontexte.
Aber wie geht das mit sprachspezifischen Sortierregeln um? Berücksichtigt es das Gebietsschema?
Nein, list.sort()ist eine generische Sortierfunktion. Wenn Sie nach den Unicode-Regeln sortieren möchten, müssen Sie eine benutzerdefinierte Sortiertastenfunktion definieren. Sie können versuchen, das Pyuca- Modul zu verwenden, aber ich weiß nicht, wie vollständig es ist.
Das ist keine Liste von Zeichenfolgen, die Sie hier sortieren
Mnl
0
Oder vielleicht:
names =['Jasmine','Alberto','Ross','dig-dog']print("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
locale
und es ist String-Kollatierungsmethoden, um natürlich nach dem aktuellen Gebietsschema zu sortieren.Antworten:
Grundlegende Antwort:
Dies ändert Ihre ursprüngliche Liste (dh sortiert an Ort und Stelle). Verwenden Sie die folgende
sorted()
Funktion, um eine sortierte Kopie der Liste zu erhalten, ohne das Original zu ändern :Die obigen Beispiele sind jedoch etwas naiv, da sie das Gebietsschema nicht berücksichtigen und eine Sortierung nach Groß- und Kleinschreibung durchführen. Sie können den optionalen Parameter nutzen
key
, um eine benutzerdefinierte Sortierreihenfolge anzugeben (die Alternativecmp
ist eine veraltete Lösung, da sie mehrmals ausgewertet werden muss -key
wird nur einmal pro Element berechnet).So sortieren Sie nach dem aktuellen Gebietsschema unter Berücksichtigung sprachspezifischer Regeln (
cmp_to_key
ist eine Hilfsfunktion von functools):Und schließlich können Sie bei Bedarf ein benutzerdefiniertes Gebietsschema zum Sortieren angeben :
Letzte Anmerkung: Sie sehen Beispiele für die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung, bei denen die
lower()
Methode verwendet wird. Diese sind falsch, da sie nur für die ASCII-Teilmenge von Zeichen funktionieren. Diese beiden sind für nicht englische Daten falsch:quelle
mylist.sort(key=str.lower)
ist schneller.[1, 2, 3].sort()
. Wennsort()
die Liste an Ort und Stelle sortiert wird (dh die Liste direkt geändert wird), wird die sortierte Liste nicht zurückgegeben und es wird tatsächlich nichts zurückgegeben, sodass Ihre Druckanweisung gedruckt wirdNone
. Wenn Sie Ihre Liste in einer Variablen gespeichert haben, z. B.x
aufgerufenx.sort()
,print(x)
wird die sortierte Liste angezeigt.Es ist auch erwähnenswert, die
sorted()
Funktion:Dies gibt eine neue, sortierte Version einer Liste zurück, ohne die ursprüngliche Liste zu ändern.
quelle
So einfach ist das wirklich :)
quelle
Der richtige Weg, um Strings zu sortieren, ist:
Das vorherige Beispiel von
mylist.sort(key=lambda x: x.lower())
funktioniert gut nur für ASCII-Kontexte.quelle
Bitte verwenden Sie die Funktion sortiert () in Python3
quelle
Nein,
list.sort()
ist eine generische Sortierfunktion. Wenn Sie nach den Unicode-Regeln sortieren möchten, müssen Sie eine benutzerdefinierte Sortiertastenfunktion definieren. Sie können versuchen, das Pyuca- Modul zu verwenden, aber ich weiß nicht, wie vollständig es ist.quelle
Alte Frage, aber wenn Sie eine länderbezogene Sortierung ohne Einstellung durchführen möchten,
locale.LC_ALL
können Sie dies mithilfe der PyICU-Bibliothek tun, wie in dieser Antwort vorgeschlagen :Dann rufen Sie an mit zB:
Dies funktionierte bei mir, ohne dass Gebietsschemas installiert oder andere Systemeinstellungen geändert wurden.
(Dies wurde bereits in einem Kommentar oben vorgeschlagen , aber ich wollte es stärker hervorheben, weil ich es zuerst selbst verpasst habe.)
quelle
Annehmen
s = "ZWzaAd"
Um über der Zeichenfolge zu sortieren, liegt die einfache Lösung unter einer.
quelle
quelle
Ergebnis
quelle
Es ist einfach: https://trinket.io/library/trinkets/5db81676e4
Scores = Scores.split (',') für x in sortiert (Scores): print (x)
quelle