2013-07-04 10 views
18

Próbuję listę ciągów znaków zawierających cyfryJak sortować listy Pythona ciągów liczb

a = ["1099.0","9049.0"] 
a.sort() 
a 
['1099.0', '9049.0'] 

b = ["949.0","1099.0"] 
b.sort()  

b 
['1099.0', '949.0'] 

a 
['1099.0', '9049.0'] 

Ale lista b sortowania jest sortowanie i nie listy a

+1

'A' jest już posortowana. '1' jest mniejsze niż' 9'. –

+1

Chcę, aby większa liczba znajdowała się w indeksie '0' zawsze i mniej przy indeksie' 0' –

+0

możliwy duplikat [Sortowanie liczb w formacie smyczkowym z pythonem] (http://stackoverflow.com/questions/2597099/sorting-numbers -in-string-format-with-python) –

Odpowiedz

50

chcesz posortować na podstawie wartości float (a nie do wartości string), więc spróbuj :

>>> b = ["949.0","1099.0"] 
>>> b.sort(key=float) 
>>> b 
['949.0', '1099.0'] 
+4

waw! miło, więc łatwo zapamiętać to rozwiązanie. –

+0

dziękuję za pomoc –

+0

Nie wiedziałem, że możesz to zrobić. Miły. – enginefree

1

Oboje są sortowane. "1" pojawia się przed "9". Spojrzeć tutaj: Ascii table

+0

Tak dzięki ... całkowicie moja wina –

3

konwertować je do int lub float lub nawet decimal (ponieważ ma numery końcowe)

>>> b = [float(x) for x in b] 
>>> b.sort() 
>>> b 
[949.0, 1099.0] 
+0

Oznaczałoby to zmianę typów elementów w 'b', co może, ale nie musi być idealne. – arshajii

12

użyć lambda wewnątrz rodzaju je konwertować do pływaka a następnie posortować odpowiednio:

a = sorted(a, key=lambda x: float(x)) 

więc będziesz mantain je jako ciągi ale klasyfikowane według wartości i nie leksykograficznie

+2

@Keyser Chodzi mi o to, że nie potrzebujesz lambda, możesz po prostu użyć 'key = float'. – arshajii

+0

, aby moja odpowiedź była fajna? właściwie, zapomniałem o kluczowych funkcjach. @Keyser używając 'sort (key = float)' osiąga to samo –

Powiązane problemy