Python – ordenar la lista de la lista

Tengo una lista en este formato:

exon_start exon_finish nombre_genético (repetido cientos de veces)

Quiero ordenar por exon_start

Ejemplo de lista:

['8342758', '8344137', 'NM_001042682'] ['85420368', '85421471', 'NM_032184'] ['86363115', '86364485', 'NM_152890'] ['89820771', '89822936', 'NM_015350'] ['904123', '905900', 'NR_027693'] ['91176416', '91179454', 'NM_201269'] ['92418409', '92420740', 'NM_015237'] ['93575521', '93577419', 'NR_034089'] ['94114411', '94116006', 'NM_014597'] ['99926918', '99928016', 'NM_017734'] 

Esta lista de listas (impresas arriba) ya se ha ordenado con el siguiente código:

 sorted_triplets = sorted(triplets, key=lambda x: x[0]) for i in sorted_triplets: print i 

Sin embargo, “ordenado” no funciona como espero. Como puede ver en la lista, 904123 es menor que 89820771. Por lo tanto, parece que “ordenado” no compara los números como un todo, sino como dígitos individuales.

¿Cómo puedo solucionar esto?

Los está ordenando como cadenas, por lo que el orden es ‘alfabético’. Es decir, va carácter por personaje y se compara, en lugar de compararlos como valores escalares.

Así que hazlo:

 sorted_triplets = sorted(triplets, key=lambda x: int(x[0])) 

Y debería funcionar.

convertir cadenas a números

 sorted(triplets, key=lambda x: int(x[0])) 

Convierta exon_start en un entero, las cadenas se ordenan lexicográficamente.

Correcto, porque lo que tienes son cuerdas, no números. Se ordenará lexicográficamente. Es posible que desee convertirlos a números (enteros) primero.

Parece que tu “número” es en realidad una cadena. Convierta esta cadena en un entero (int (cadena)), entonces la clasificación debería funcionar

Añadir int () llamada.

 sorted_triplets = sorted(triplets, key=lambda x: int(x[0]))