Wie sortiert man eine Liste von Zeichenketten?

Wie kann man in Python am besten eine alphabetisch sortierte Liste erstellen?

Lösung

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)
Kommentare (8)
list.sort()

Es ist wirklich so einfach :)

Kommentare (0)

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.

Kommentare (0)