Antworten:
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 cmp
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):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Und schließlich können Sie bei Bedarf ein benutzerdefiniertes Gebietsschema zum Sortieren 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']
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)
mylist.sort(key=str.lower)
ist schneller.
[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. x
aufgerufen x.sort()
, print(x)
wird die sortierte Liste angezeigt.
Es ist auch erwähnenswert, die sorted()
Funktion:
for x in sorted(list):
print x
Dies gibt eine neue, sortierte Version einer Liste zurück, ohne die ursprüngliche Liste zu ändern.
Der richtige Weg, um Strings zu sortieren, ist:
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'), 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.
Bitte verwenden Sie die Funktion sortiert () in Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
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.
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 :
import icu # PyICU
def sorted_strings(strings, locale=None):
if locale is None:
return sorted(strings)
collator = icu.Collator.createInstance(icu.Locale(locale))
return sorted(strings, key=collator.getSortKey)
Dann rufen Sie an mit zB:
new_list = sorted_strings(list_of_strings, "de_DE.utf8")
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.)
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()))
Es ist einfach: https://trinket.io/library/trinkets/5db81676e4
scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'
Scores = Scores.split (',') für x in sortiert (Scores): print (x)
locale
und es ist String-Kollatierungsmethoden, um natürlich nach dem aktuellen Gebietsschema zu sortieren.