lista de clasificación en Python

si tengo una lista de cadenas, por ejemplo, ["a143.txt", "a9.txt", ] ¿cómo puedo clasificarla en orden ascendente por los números de la lista, en lugar de por la cadena? Es decir, quiero que "a9.txt" aparezca antes de "a143.txt" desde 9 < 143 .

Gracias.

Se llama “orden de clasificación natural”, de http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

Prueba esto:

 import re def sort_nicely( l ): """ Sort the given list in the way that humans expect. """ convert = lambda text: int(text) if text.isdigit() else text alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] l.sort( key=alphanum_key ) 

Utilice list.sort() y proporcione su propia función para el argumento key . Se llamará a su función para cada elemento de la lista (y se pasó el elemento), y se espera que devuelva una versión de ese elemento que se ordenará.

Consulte http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions para obtener más información.

Si desea ignorar completamente las cadenas, entonces debe hacer

 import re numre = re.compile('[0-9]+') def extractNum(s): return int(numre.search(s).group()) myList = ["a143.txt", "a9.txt", ] myList.sort(key=extractNum) 
 >>> paths = ["a143.txt", "a9.txt"] >>> sorted(paths, key=lambda s: int(re.search("\d+", s).group())) ['a9.txt', 'a143.txt'] 

Más genérico, si quieres que funcione también para archivos como: a100_32_12 (y clasificación por grupos numéricos):

 >>> paths = ["a143_2.txt", "a143_1.txt"] >>> sorted(paths, key=lambda s: map(int, re.findall("\d+", s))) ['a143_1.txt', 'a143_1.txt'] 

list.sort() está en desuso (consulte Python.org How-To ). sorted(list, key=keyfunc) es mejor.

 import re def sortFunc(item): return int(re.search(r'[a-zA-Z](\d+)', item).group(1)) myList = ["a143.txt", "a9.txt"] print sorted(myList, key=sortFunc)