Hoe sorteer ik een lijst van strings?

Wat is de beste manier om een alfabetisch gesorteerde lijst te maken in Python?

Oplossing

Basis antwoord:

mylist = ["b", "C", "A"]
mylist.sort()

Dit wijzigt je originele lijst (d.w.z. sorteert in-place). Om een gesorteerde kopie van de lijst te krijgen, zonder het origineel te wijzigen, gebruik je de sorted() functie:

for x in sorted(mylist):
    print x

De voorbeelden hierboven zijn echter een beetje naïef, omdat ze geen rekening houden met locale, en een hoofdletter-gevoelige sortering uitvoeren. U kunt gebruik maken van de optionele parameter key om een aangepaste sorteervolgorde op te geven (het alternatief, het gebruik van cmp, is een verouderde oplossing, omdat het meerdere keren moet worden geëvalueerd - key wordt slechts eenmaal per element berekend).

Dus, om te sorteren op basis van de huidige locale, rekening houdend met taal-specifieke regels (cmp_to_key is een helper-functie van functools):

sorted(mylist, key=cmp_to_key(locale.strcoll))

En tenslotte kunt u, indien nodig, een aangepaste locale opgeven om te sorteren:

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']

Laatste opmerking: je zult voorbeelden zien van hoofdletter-ongevoelig sorteren die de lower() methode gebruiken - die zijn onjuist, omdat ze alleen werken voor de ASCII subset van karakters. Deze twee zijn fout voor alle niet-Engelse gegevens:

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Commentaren (8)
list.sort()

Het is echt zo simpel :)

Commentaren (0)

Maar hoe gaat dit om met taalspecifieke sorteerregels? Houdt het rekening met locale?

Nee, list.sort() is een generieke sorteer functie. Als je wilt sorteren volgens de Unicode regels, zul je'een aangepaste sorteersleutel functie moeten definiëren. Je kunt proberen de pyuca module te gebruiken, maar ik'weet niet hoe compleet die is.

Commentaren (0)