2009-01-13 23 views
10

parte de un programa se basa esta lista,pitón, ordenar una lista por una clave que es una subcadena de cada elemento

[u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale'] 

Actualmente estoy tratando de ordenar por orden alfabético por el nombre de la evolución en lugar de el número. ¿Hay alguna manera de que pueda hacer esto sin cambiar el orden en que aparecen las dos cosas en la lista (como en 'intelecto x 1')?

+1

Como nota al margen, puede que le resulte más conveniente en general si lo convierte en una lista de tuplas en lugar de cadenas unicode; en particular, las tuplas con nombre pueden ayudar realmente a la legibilidad del código. –

Respuesta

23

usted tiene que conseguir la "llave" de la cadena.

def myKeyFunc(aString): 
    stuff, x, label = aString.partition(' x ') 
    return label 

aList.sort(key= myKeyFunc) 
+0

¿qué quieres decir con cosas? – user33061

+0

Exactamente y exactamente lo que dice. Eso es solo "cosas". "objetos diversos no especificados" de acuerdo con un diccionario de sinónimos. El método de partición de una cadena arroja tres resultados. Una de ellas es solo "cosas" que nunca se vuelven a usar. –

+0

En este contexto, lo que está delante de la "x" puede ser significativo, pero no podemos decir a partir de la pregunta qué es o qué significa. Como la pregunta es vaga, solo podemos llamarla "cosas". –

-10

Como está tratando de ordenar lo que es esencialmente datos personalizados, iría con una ordenación personalizada.

Merge sort
Bubble sort
Quicksort

+1

No, desea utilizar el método de clasificación integrado con un comparador personalizado. –

+0

¿Es eso lo que S.Lott ha hecho? Si no, ¿podría compartir un ejemplo de código? – Teifion

+0

Es lo que S. Lott ha hecho. – recursive

2

Sin saber si sus artículos están normalizados a 1 dígito, 1 plaza, 1 'x', 1 plaza, varias palabras que escribí esto:

mylist = [u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale'] 
def sort(a, b): 
    return cmp(" ".join(a.split()[2:]), " ".join(b.split()[2:])) 

mylist.sort(sort) 

puede editar el análisis dentro de la sort método, pero es probable que tenga la idea.

Saludos, Patrick

+1

Es mejor usar la clave = que un comparador personalizado cuando se puede porque un comparador personalizado debe llamarse n * log n veces, pero la función de la tecla solo necesita n llamadas. – recursive

+0

No lo sabía. Gracias recursivo! – pboucher

10

¿Qué tal:

lst.sort(key=lamdba s: s.split(' x ')[1]) 
+0

su muestra tiene un error tipográfico en la palabra 'lambda' – r0101

1

Para ello, es necesario implementar una costumbre comparar:

def myCompare(x, y): 
    x_name = " ".join(x.split()[2:]) 
    y_name = " ".join(y.split()[2:]) 
    return cmp(x_name, y_name) 

Luego se lo utiliza comparar definición como la entrada a su función de clasificación:

myList.sort(myCompare) 
Cuestiones relacionadas