2010-04-08 1 views
7

Ho una lista che ha alcuni numeri di capitolo in stringa. Quando ordino i tasti usando la funzione tasti, mi danno risultati errati.Ordinamento di numeri in formato stringa con Python

 
keys = ['1.1', '1.2', '2.1', '10.1'] 
keys.sort() 
print keys 

['1.1', '1.2', '10.1', '2.1'] 

Come posso utilizzare la funzione di ordinamento per ottenere

 
['1.1', '1.2', '2.1', '10.1'] 

Che cosa succede se l'array ha qualcosa di simile?

 
['1.1.1', '1.2.1', '10.1', '2.1'] -> ['1.1.1','1.2.1','2.1','10.1'] 

+0

Prosseek prova questo: 'keys.sort (key = float)', ho appena imparato [qui] (http://stackoverflow.com/questions/17474211/how-to-sort-python-list-of-strings -di-numeri/17474264 # 17474264) –

risposta

10
keys.sort(key=lambda x: [int(y) for y in x.split('.')]) 
2

questo funziona:

keys.sort(key=lambda x: map(int, x.split('.'))) 
+0

+1 Questa è una buona risposta per python2. In Python3 le mappe di smistamento non funzionano più, quindi è necessario usare 'list (map (...))' che è a mio avviso più brutto della comprensione delle liste. –

1

Fornire un argomento personalizzato key-sort o sorted.

Da http://docs.python.org/library/functions.html#sorted:

key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).

+0

'>>> float ('1.1.1')' ... 'ValueError: letterale non valido per float(): 1.1.1' –

+0

dang. Ho alzato la tua risposta – harto

4
from distutils.version import StrictVersion 
keys.sort(key=StrictVersion) 

Dato che i numeri dei capitoli sono un sottoinsieme dei numeri di versione, questa copre le vostre esigenze.

+1

Creato per me. Tuttavia, ho usato 'LooseVersion' dallo stesso modulo invece perché ho ordinato le versioni da una fonte esterna. –