Jak posortować listę ciągów?

417

Jaki jest najlepszy sposób tworzenia listy posortowanej alfabetycznie w Pythonie?

skolima
źródło
1
Użyj localei to metody sortowania ciągów, aby sortować naturalnie zgodnie z bieżącymi ustawieniami narodowymi.
u0b34a0f6ae

Odpowiedzi:

519

Podstawowa odpowiedź:

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

To modyfikuje twoją oryginalną listę (tzn. Sortuje na miejscu). Aby uzyskać posortowaną kopię listy, bez zmiany oryginału, użyj sorted()funkcji:

for x in sorted(mylist):
    print x

Jednak powyższe przykłady są nieco naiwne, ponieważ nie uwzględniają ustawień regionalnych i wykonują sortowanie z rozróżnianiem wielkości liter. Możesz skorzystać z opcjonalnego parametru, keyaby określić niestandardową kolejność sortowania (alternatywa, używając cmp, jest przestarzałym rozwiązaniem, ponieważ musi być oceniana wiele razy - keyjest obliczana tylko raz dla elementu).

Tak więc, aby posortować według aktualnych ustawień regionalnych, biorąc pod uwagę reguły specyficzne dla języka ( cmp_to_keyjest funkcją pomocniczą z funools):

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

I na koniec, jeśli potrzebujesz, możesz określić niestandardowe ustawienia regionalne do sortowania:

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

Ostatnia uwaga: zobaczysz przykłady sortowania bez rozróżniania wielkości liter, które używają tej lower()metody - są one niepoprawne, ponieważ działają tylko dla podzbioru znaków ASCII. Te dwie wartości są błędne w przypadku danych innych niż angielskie:

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Eli Courtwright
źródło
37
mylist.sort(key=str.lower)jest szybszy.
jfs
1
Słuszna uwaga. Zostawię obecny przykład bez zmian, ponieważ początkujący prawdopodobnie łatwiej będzie zobaczyć, co się dzieje, ale będę o tym pamiętać w przyszłości.
Eli Courtwright
1
Jeśli ktoś jest ciekawy, wydajność list.sort () można znaleźć tutaj
Hari Ganesan
1
@BornToCode: 1- Wiem . Spójrz na wersję (2008), na którą odpowiada mój komentarz (mój komentarz dotyczy niepotrzebnego użycia lambda). 2- sortowanie znaków spoza ASCII to duży osobny temat. Można zastosować PyICU zamiast rozwiązania opartego na ustawieniach regionalnych.
jfs
1
@Dmitry To dlatego, że są drukowane wartość zwracaną przez funkcję sortowania w nazwie [1, 2, 3].sort(). Gdy sort()sortuje listę w miejscu (tj. Zmienia listę bezpośrednio), nie zwraca ona posortowanej listy, a tak naprawdę niczego nie zwraca, więc drukowana jest instrukcja drukowania None. Jeśli zapisałeś listę do zmiennej, powiedzmy x, wywołanej x.sort(), print(x)zobaczysz posortowaną listę.
bjg222,
56

Warto również zwrócić uwagę na sorted()funkcję:

for x in sorted(list):
    print x

Zwraca nową, posortowaną wersję listy bez zmiany oryginalnej listy.

Greg Hewgill
źródło
36
list.sort()

To naprawdę takie proste :)

rix0rrr
źródło
18

Właściwy sposób sortowania ciągów znaków to:

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

Poprzedni przykład mylist.sort(key=lambda x: x.lower())będzie działał dobrze dla kontekstów tylko ASCII.

schmichael
źródło
13

Proszę użyć funkcji sorted () w Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Mahmud Ahsan
źródło
10

Ale w jaki sposób obsługuje to reguły sortowania specyficzne dla języka? Czy bierze pod uwagę ustawienia regionalne?

Nie, list.sort()jest ogólną funkcją sortowania. Jeśli chcesz sortować zgodnie z regułami Unicode, musisz zdefiniować niestandardową funkcję klawisza sortowania. Możesz spróbować użyć modułu pyuca , ale nie wiem, jak jest kompletny.

John Millikin
źródło
1

Stare pytanie, ale jeśli chcesz przeprowadzić sortowanie uwzględniające ustawienia regionalne bez ustawiania, locale.LC_ALL możesz to zrobić, korzystając z biblioteki PyICU zgodnie z sugestią podaną w tej odpowiedzi :

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)

Następnie zadzwoń np .:

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

Działa to dla mnie bez instalowania ustawień narodowych ani zmiany innych ustawień systemowych.

(Zostało to już zasugerowane w powyższym komentarzu , ale chciałem nadać mu większą rangę, ponieważ na początku sam tego brakowało).

vlz
źródło
0

Przypuszczać s = "ZWzaAd"

Aby posortować powyżej ciągu, proste rozwiązanie będzie poniżej jednego.

print ''.join(sorted(s))
JON
źródło
nie jest to lista ciągów, które tutaj sortujesz
mnl
0

Albo może:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Dragos Alexe
źródło
0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Wynik

[„abc”, „ba”, „cd”, „dc”, „xy”]

asing177
źródło
0

To proste: 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'

score = score.split (',') for x in sorted (score): print (x)

Hedayatullah Sarwary
źródło