2008-08-30 24 views

Odpowiedz

384

odpowiedź podstawowa:

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

ten modyfikuje swoją pierwotną listę (tj sortuje w miejscu). Aby uzyskać posortowane kopię listy, bez zmiany oryginału, użyj sorted() funkcję:

for x in sorted(mylist): 
    print x 

Jednak powyższe przykłady są nieco naiwne, ponieważ nie biorą pod uwagę locale i przeprowadzić sprawę - wrażliwe sortowanie. Możesz skorzystać z opcjonalnego parametru key, aby określić niestandardowy porządek sortowania (alternatywa, użycie cmp, jest przestarzałym rozwiązaniem, ponieważ musi zostać oszacowana wiele razy - key jest obliczana tylko raz dla każdego elementu).

Tak więc, aby posortować według bieżącej lokalizacji, biorąc reguł danego języka pod uwagę (cmp_to_key jest funkcja pomocnika z functools):

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

I wreszcie, jeśli trzeba, to można określić custom locale 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: będzie można zobaczyć przykłady bez uwzględniania wielkości liter sortowania, które wykorzystują metodę lower() - to nieprawidłowe, ponieważ działają one tylko dla podzbioru znaków ASCII. Ci dwaj są złe dla każdego nieanglojęzycznych danych:

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

'mylist.sort (key = str.lower)' jest szybsze. – jfs

+0

Dobra uwaga. Zostawię obecny przykład bez zmian, ponieważ początkujący może łatwiej zorientować się, co się dzieje, ale będę o tym pamiętać w przyszłości. –

+1

Jeśli ktoś jest ciekawy, wydajność list.sort() można znaleźć [tutaj] (http://stackoverflow.com/questions/1517347/about-pythons-built-in-sort-method) –

32
list.sort() 

To naprawdę jest takie proste :)

+2

Nie działa w Pythonie 3.6 z liczbami. Zamiast tego użyj "sorted (list)". – Dmitry

10

Ale jak to specyficzny język uchwyt sortowania zasady? Czy bierze pod uwagę lokalizację?

Nie, list.sort() to ogólna funkcja sortowania. Jeśli chcesz sortować według reguł Unicode, musisz zdefiniować niestandardową funkcję klucza sortowania. Możesz spróbować użyć modułu pyuca, ale nie wiem, jak to jest kompletne.

41

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

for x in sorted(list): 
    print x 

ta zwraca nową wersję, sortowanie listy bez zmiany oryginalnej listy.

18

Właściwym sposobem sortowania ciągi jest:

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

poprzednim przykładzie mylist.sort(key=lambda x: x.lower()) będzie działać dobrze dla kontekstów ASCII-only.

1

Załóżmy s = "ZWzaAd"

Aby rozwiązać powyższy ciąg proste rozwiązanie będzie poniżej jednego.

print ''.join(sorted(s)) 
4

Proszę używać posortowane funkcji() w Python3

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