Ordenar la lista de cadenas según el número en la cadena

Por ejemplo tengo lista

my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg'] 

y

 my_list.sort() 

me da

 ['image1.jpg', 'image101.jpg', 'image2.jpg'] 

pero por supuesto necesito

 ['image1.jpg', 'image2.jpg', 'image101.jpg'] 

¿Cómo se puede hacer?

list.sort acepta la función de key opcional. Cada elemento se pasa a la función, y el valor de retorno de la función se utiliza para comparar elementos en lugar de los valores originales.

 >>> my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg'] >>> my_list.sort(key=lambda x: int(''.join(filter(str.isdigit, x)))) >>> my_list ['image1.jpg', 'image2.jpg', 'image101.jpg'] 

filter , str.isdigit fueron utilizados para extraer números:

 >>> ''.join(filter(str.isdigit, 'image101.jpg')) '101' >>> int(''.join(filter(str.isdigit, 'image101.jpg'))) 101 
  • ''.join(..) no es necesario en Python 2.x

Use una expresión regular para extraer el número de la cadena y convertir a int:

 import re r = re.compile("\d+") l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg'] l.sort(key=lambda x: int(r.search(x).group())) 

O tal vez utilice un regex más específico, incluido el . :

 import re r = re.compile("(\d+)\.") l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg'] l.sort(key=lambda x: int(r.search(x).group())) 

Ambos dan la misma salida para tu ejemplo de entrada:

 ['image1.jpg', 'image2.jpg', 'image101.jpg'] 

Si está seguro de la extensión, puede utilizar una expresión regular muy específica:

  r = re.compile("(\d+)\.jpg$") l.sort(key=lambda x: int(r.search(x).group(1))) 

En realidad no necesitas ningún regex patern. Puedes analizar fácilmente así.

 >>> 'image101.jpg'[5:-4] '101' 

Solución:

 >>> sorted(my_list, key=lambda x: int(x[5:-4])) ['image1.jpg', 'image2.jpg', 'image101.jpg'] 

Si desea hacer esto en el caso general, probaría un paquete de clasificación natural como natsort .

 from natsort import natsorted my_list = ['image101.jpg', 'image2.jpg', 'image1.jpg'] natsorted(my_list) 

Devoluciones:

 ['image1.jpg', 'image2.jpg', 'image101.jpg'] 

Puedes instalarlo usando pip ie pip install natsort