2010-04-08 7 views
7

Tengo una lista que tiene algunos números de capítulo en cadena. Cuando clasifico las teclas usando la función de teclas, me da resultados incorrectos.Ordenando números en formato de cadena con Python

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

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

¿Cómo puedo utilizar la función de clasificación para obtener

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

¿Qué pasa si la matriz tiene algo como esto?

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

+0

Prosseek prueba esto: 'keys.sort (key = float)', Acabo de aprender [aquí] (http://stackoverflow.com/questions/17474211/how-to-sort-python-list-of-strings -of-numbers/17474264 # 17474264) –

Respuesta

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

esto funciona:

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

+1 Esta es una buena respuesta para python2. En Python3, los mapas de ordenación ya no funcionan, por lo que necesitas usar 'list (map (...))' que es más feo que la comprensión de la lista, en mi opinión. –

1

Proporcionar un argumento a medida key-sort o sorted.

De 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: literal no válido para float(): 1.1.1' –

+0

dang. Su voto ha sido votado – harto

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

Puesto que los números de los capítulos son un subconjunto de los números de versión, esto cubre sus necesidades.

+1

Creado para mí. Sin embargo, usé 'LooseVersion' del mismo módulo porque selecciono las versiones de una fuente externa. –

Cuestiones relacionadas