Wie kann man in Python am besten eine alphabetisch sortierte Liste erstellen?
Einfache Antwort:
mylist = ["b", "C", "A"]
mylist.sort()
Dies verändert Ihre ursprüngliche Liste (d.h. sortiert an Ort und Stelle). Um eine sortierte Kopie der Liste zu erhalten, ohne das Original zu verändern, verwenden Sie die Funktion sorted()
:
for x in sorted(mylist):
print x
Die obigen Beispiele sind jedoch etwas naiv, da sie die Gebietsschema nicht berücksichtigen und eine Sortierung unter Berücksichtigung der Groß- und Kleinschreibung vornehmen. Sie können den optionalen Parameter key
nutzen, um eine eigene Sortierreihenfolge festzulegen (die Alternative, cmp
zu verwenden, ist eine veraltete Lösung, da sie mehrfach ausgewertet werden muss - key
wird nur einmal pro Element berechnet).
Also, um nach dem aktuellen Gebietsschema zu sortieren, wobei sprachspezifische Regeln berücksichtigt werden (cmp_to_key
ist eine Hilfsfunktion von functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Und schließlich können Sie bei Bedarf ein eigenes Gebietsschema für die Sortierung angeben:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
Letzter Hinweis: Sie werden Beispiele für die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung sehen, die die Methode lower()
verwenden - diese sind falsch, weil sie nur für die ASCII-Untermenge von Zeichen funktionieren. Diese beiden sind für alle nicht-englischen 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)
Aber wie werden dabei sprachspezifische Sortierregeln behandelt? Berücksichtigt es das Gebietsschema?
Nein, list.sort()
ist eine generische Sortierfunktion. Wenn du nach den Unicode-Regeln sortieren willst, musst du eine eigene Sortierfunktion definieren. Du kannst versuchen, das pyuca Modul zu benutzen, aber ich weiß nicht, wie vollständig es ist.