2010-11-26 20 views
5

que tiene una lista de cadenas:Ordenar lista de cadenas de sufijo entero en Python

[song_1, song_3, song_15, song_16, song_4, song_8] 

me gustaría que los clasifique por el # al final, por desgracia, ya que los números más bajos no son "08" y son "8", se tratan como mayores de 15 en orden lexicográfico.

sé que tengo que pasar una clave para la función de clasificación, vi esto en alguna parte en este sitio para ordenar los números decimales que son cadenas:

sorted(the_list, key=lambda a:map(int,a.split('.')) 

Pero eso fue para "1.2, 2.5, 2.3" pero no tengo ese caso. Pensé en reemplazar ''. con '_', pero por lo que entiendo, convierte ambos lados en ints, que fallarán ya que el lado izquierdo de _ es una cadena.

Cualquier ayuda se agradece

EDITAR: Olvidé mencionar que todos los prefijos son los mismos (canción en este ejemplo)

Respuesta

12

Estás cerca.

sorted(the_list, key = lambda x: int(x.split("_")[1])) 

debería hacerlo. Esto se divide en el guión bajo, toma la segunda parte (es decir, la que está después del primer subrayado) y la convierte en un número entero para usar como clave.

3
sorted(the_list, key = lambda k: int(k.split('_')[1])) 
5

Bueno, que desea ordenar por el nombre del archivo en primer lugar, a continuación, en la parte int:

def splitter(fn): 
    try: 
     name, num = fn.rsplit('_',1) # split at the rightmost `_` 
     return name, int(num) 
    except ValueError: # no _ in there 
     return fn, None 

sorted(the_list, key=splitter) 
1
def number_key(name): 
    parts = re.findall('[^0-9]+|[0-9]+', name) 
    L = [] 
    for part in parts: 
     try: 
      L.append(int(part)) 
     except ValueError: 
      L.append(part) 
    return L 
sorted(your_list, key=number_key) 
Cuestiones relacionadas