¿Cómo ordeno una lista de números de sección en Python?

Las secciones de los libros suelen estar numeradas como xxx , como 1.2.3 . ¿Cómo ordeno una lista de números de sección?

Almacena los números de sección como una lista de cadenas.

 # a list of strings, section numbers ls = ['1.1', '1.10', '1.2', '1.2.3', '1.2.1', '1.9'] lists = sorted([s.split('.') for s in ls], key=lambda x:map(int, x)) # [['1', '1'], ['1', '2'], ['1', '2', '1'], ['1', '2', '3'], ['1', '9'], ['1', '10']] r = ['.'.join(sublist) for sublist in lists] #['1.1', '1.2', '1.2.1', '1.2.3', '1.9', '1.10'] 

Sin embargo, mi resultado esperado es,

 ['1.1', '1.10', '1.2', '1.2.1', '1.2.3', '1.9'] 

Utilice una función de comparación personalizada que convierte las cadenas en sub-listas de enteros. Aquellos se ordenarán correctamente sin problemas.

 In [4]: ls = ['1.1', '1.10', '1.2', '1.2.3', '1.2.1', '1.9'] In [5]: def section(s): ...: return [int(_) for _ in s.split(".")] ...: In [6]: sorted(ls, key=section) Out[6]: ['1.1', '1.2', '1.2.1', '1.2.3', '1.9', '1.10'] 

Como por sus comentarios, float no es el tipo de datos que necesita. En su caso, tiene una jerarquía real de capítulos / secciones.

Una manera simple (y recuerde, simple es mejor que compleja) es representar los números de las secciones como tuplas. Dado que las tuplas se clasifican de forma lexicográfica, naturalmente se ordenan en el orden deseado:

 >>> lf = [(1, ), (1, 1), (1, 10), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (2, ), (1, 9)] >>> sorted(lf) [(1, ), (1, 1), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (2, )] 

Como podemos ver, esto también funciona para tuplas con diferentes longitudes.

Si desea mantener las secciones como cadenas, natsort hace un buen trabajo en el manejo de valores punteados:

 >>> s = ['1', '1.1', '1.10', '1.2'] >>> natsort.natsorted(s) ['1', '1.1', '1.2', '1.10'] 

También puede definir su propia clase SectionNumber , pero eso es probablemente una exageración.

Las secciones de libros usualmente están numeradas como xxx

¿Por qué no almacenar los números de sección como tuplas?

 sections = [(2, 4, 1), (1, 10, 3),(1, 2, 1), (1, 1, 10), (1, 2, 3), (1, 4, 6)] print(sorted(sections)) 

da [(1, 1, 10), (1, 2, 1), (1, 2, 3), (1, 4, 6), (1, 10, 3), (2, 4, 1)]