Hvordan sortere en liste over strenger?

stemmer
334

Hva er den beste måten å skape en alfabetisk liste i Python?

Publisert på 30/08/2008 klokken 17:03
kilden bruker
På andre språk...                            


9 svar

stemmer
431

Grunnleggende svar:

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

Dette endrer den opprinnelige listen (dvs. slags in-sted). For å få en sortert kopi av listen, uten å endre den opprinnelige, bruker du sorted()funksjonen:

for x in sorted(mylist):
    print x

Men eksemplene ovenfor er litt naive, fordi de ikke tar hensyn til lokalitet, og utføre en versalsensitivt sortering. Man kan dra nytte av den valgfrie parameter keyfor å angi tilpasset sortering orden (alternativet, ved hjelp av cmp, er et avviklet løsning, da det må bli vurdert flere ganger - keyer bare beregnet en gang per element).

Så, for å sortere i henhold til gjeldende nasjonale innstillingen, tar språkspesifikke regler i betraktning ( cmp_to_keyer en hjelper funksjon fra functools):

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

Og til slutt, hvis du trenger, kan du angi en tilpasset locale for sortering:

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

Siste notat: du vil se eksempler på store eller små bokstaver sortering som bruker lower()metoden - de er feil, fordi de fungerer bare for ASCII undergruppe av tegn. De to er galt for noen ikke-engelske data:

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Svarte 30/08/2008 kl. 17:10
kilden bruker

stemmer
47

Det er også verdt å merke seg den sorted()funksjonen:

for x in sorted(list):
    print x

Dette returnerer en ny, sortert versjon av en liste uten å endre den opprinnelige listen.

Svarte 30/08/2008 kl. 22:14
kilden bruker

stemmer
34
list.sort()

Det er virkelig så enkelt :)

Svarte 30/08/2008 kl. 17:04
kilden bruker

stemmer
18

Den riktige måten å sortere strenger er:

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

Den forrige eksempel mylist.sort(key=lambda x: x.lower())vil fungere fint for ASCII-bare sammenhenger.

Svarte 28/10/2009 kl. 22:45
kilden bruker

stemmer
10

Men hvordan dette håndtaket språkspesifikke sortering reglene? Tar det locale hensyn til?

Nei, list.sort()er en generisk sorteringsfunksjon. Hvis du ønsker å sortere i henhold til Unicode regler, må du definere en egendefinert sorteringsnøkkel funksjon. Du kan prøve å bruke pyuca modul, men jeg vet ikke hvor komplett den er.

Svarte 30/08/2008 kl. 18:10
kilden bruker

stemmer
6

Bruk sorteres () -funksjonen i Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Svarte 27/12/2017 kl. 13:24
kilden bruker

stemmer
0

Gamle spørsmålet, men hvis du ønsker å gjøre locale-aware sortering uten innstilling locale.LC_ALL du kan gjøre det ved hjelp av PyICU biblioteket som foreslått av dette svaret :

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)

Deretter ringe med f.eks:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Dette fungerte for meg uten å installere noen steder eller endre andre systeminnstillinger.

(Dette ble allerede foreslått i en kommentar ovenfor , men jeg ønsket å gi det mer fremtredende, fordi jeg savnet det selv først.)

Svarte 28/08/2019 kl. 15:39
kilden bruker

stemmer
0

Eller kanskje:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Svarte 13/08/2018 kl. 15:46
kilden bruker

stemmer
0

Anta s = "ZWzaAd"

Slik sorterer over strengen den enkle løsningen vil være under ett.

print ''.join(sorted(s))
Svarte 12/05/2017 kl. 06:16
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more