Foros del Web » Programando para Internet » Python »

Python Ordenamiento numérico de una lista Alfanumérica

Estas en el tema de Python Ordenamiento numérico de una lista Alfanumérica en el foro de Python en Foros del Web. Hola Tod@s Alguien me sabría decir si hay alguna función de python ya echa para ordenar una lista numéricamente, o me podríais orientar de como ...
  #1 (permalink)  
Antiguo 26/04/2012, 00:58
 
Fecha de Ingreso: enero-2011
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 2
Python Ordenamiento numérico de una lista Alfanumérica

Hola Tod@s

Alguien me sabría decir si hay alguna función de python ya echa para ordenar una lista numéricamente, o me podríais orientar de como hacerlo ?

Ej de la lista ['pr1.jpg', 'pr2.jpg', 'pr3.jpg', ............'pr10.jpg' , ....'pr20.jpg', ....'pr30.jpg', 'pr33lo.jpg',... 'pr100.jpg']

Salutaciones y gracias.

Última edición por serrallonga25; 26/04/2012 a las 04:25
  #2 (permalink)  
Antiguo 26/04/2012, 08:37
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Python Ordenamiento numérico de una lista Alfanumérica

Pues para ordenar una lista usas lista.sort() si querés que se ordene la lista misma, o sorted(lista) si querés que se devuelva una lista nueva ordenada en vez de modificar la original.

Ambas funciones toman un parámetro opcional que indica la función que debe usarse para la comparación.

Por ejemplo, yo lo haría así:

Código Python:
Ver original
  1. def compara(a, b):
  2.     pos_punto_a = a.find('.')
  3.     pos_punto_b = b.find('.')
  4.  
  5.     numero_a = int(a[2:pos_punto_a])
  6.     numero_b = int(b[2:pos_punto_b])
  7.  
  8.     if numero_a < numero_b:
  9.         retorno = -1
  10.     elif numero_a == numero_b:
  11.         retorno = 0
  12.     else:
  13.         retorno = 1
  14.  
  15.     return retorno
  16.  
  17. lista_ordenada = sorted(lista, cmp=compara) # ->genera nueva lista ordenada
  18. lista.sort(cmp=compara) # -> ordena la lista


Saludos
  #3 (permalink)  
Antiguo 26/04/2012, 12:50
 
Fecha de Ingreso: enero-2011
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Python Ordenamiento numérico de una lista Alfanumérica

Gracias por responder tan rápido.

no savia que se le podía pasar una función de comparación.

pero continuo teniendo el problema de que el patrón anterior y posterior pude variar en diferentes listas

Ej de la lista 1 ['pr1.jpg', 'pr2.jpg', 'pr3.jpg', ............'pr10.jpg' , ....'pr20.jpg', ....'pr30.jpg', 'pr33lo.jpg',... 'pr100.jpg']

Ej de la lista 2 ['1.jpg', '2.jpg', '3.jpg', ............'10.jpg' , ....'20.jpg', ....'30.jpg', '33lo.jpg',... '100.jpg']

Ej de la lista 3 ['a_35pr1.jpg', 'a_35pr2.jpg', 'a_35pr3.jpg', ............'a_35pr10.jpg' , ....'a_35pr20.jpg', ....'a_35pr30.jpg', 'a_35pr33lo.jpg',... 'a_35pr100.jpg']
  #4 (permalink)  
Antiguo 26/04/2012, 13:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Ordenamiento numérico de una lista Alfanumérica

Código Python:
Ver original
  1. import re
  2. def compara(a, b):
  3.     numeros_a = map(int, re.findall("\d+", a))
  4.     numeros_b = map(int, re.findall("\d+", b))
  5.  
  6.     if numeros_a < numeros_b:
  7.         retorno = -1
  8.     elif numeros_a == numeros_b:
  9.         retorno = 0
  10.     else:
  11.         retorno = 1
  12.  
  13.     return retorno
Basado en la función de AlvaroG, puedes usar expresiones regulares para extraer los digitos continuos y después compararlos en listas.
  #5 (permalink)  
Antiguo 26/04/2012, 14:38
 
Fecha de Ingreso: enero-2011
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Python Ordenamiento numérico de una lista Alfanumérica

Muchas Gracias razpeitia y AlvaroG me aveis ayudado mucho.

La función me ha ido perfecta.

Código Python:
Ver original
  1. def compara(a, b):
  2.     numeros_a = map(int, re.findall("\d+", a))
  3.     numeros_b = map(int, re.findall("\d+", b))
  4.  
  5.     if len(numeros_a) == 0:
  6.         return 1
  7.  
  8.     if numeros_a < numeros_b:
  9.         retorno = -1
  10.     elif numeros_a == numeros_b:
  11.         retorno = 0
  12.     else:
  13.         retorno = 1
  14.  
  15.     return retorno

Solo he echo una pequeño añadido por que si hay un nombre que no contenga dígitos lo ponga al final en lugar del principio de la lista.

me podrías explicar un poco como funciona lo de "map"

Muchas Gracias.
  #6 (permalink)  
Antiguo 01/05/2012, 12:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python Ordenamiento numérico de una lista Alfanumérica

El funcionamiento del map esta en las faqs.

Solo para agregar creo que lo que buscas se llaman natural string sorting

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:41.