Jak posortować listę ciągów?


417

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


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)

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.



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.


13

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

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

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.


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


0

Przypuszczać s = "ZWzaAd"

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

print ''.join(sorted(s))

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

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

Wynik

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


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.