Wie sortiere ich eine Liste von Zeichenfolgen?


417

Was ist der beste Weg, um eine alphabetisch sortierte Liste in Python zu erstellen?


1
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):

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)

37
mylist.sort(key=str.lower)ist schneller.
JFS

1
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.
bjg222

56

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.



18

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.


13

Bitte verwenden Sie die Funktion sortiert () in Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

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.


1

Alte Frage, aber wenn Sie eine länderbezogene Sortierung ohne Einstellung durchführen möchten, locale.LC_ALLkö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.)


0

Annehmen s = "ZWzaAd"

Um über der Zeichenfolge zu sortieren, liegt die einfache Lösung unter einer.

print ''.join(sorted(s))

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()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Ergebnis

['abc', 'ba', 'cd', 'dc', 'xy']


0

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.