python - objects - ¿Cómo puedo ordenar tuplas por reversa, pero rompiendo las ataduras sin reversa?(Pitón)
sort python code (4)
La forma más sencilla de lograr lo que quieres es utilizar el hecho de que el género python es estable. Esto permite primero ordenar alfabéticamente y luego por puntuación:
In [11]: results = [(10, ''Mary''), (9, ''John''), (10, ''George''), (9, ''Frank''), (9, ''Adam'')]
In [12]: results.sort(key=lambda x: x[1])
In [13]: results.sort(key=lambda x: x[0], reverse=True)
In [14]: results
Out[14]: [(10, ''George''), (10, ''Mary''), (9, ''Adam''), (9, ''Frank''), (9, ''John'')]
El primer tipo ordena alfabéticamente, en orden ascendente. El segundo tipo ordena por puntaje, en orden descendente, manteniendo el orden relativo de los elementos con puntaje igual.
Puede hacer esto para hacer géneros aún más complejos. Solo recuerde que primero debe ordenar por la clave secundaria , y luego por la primera clave. (Si tiene tres teclas, primero ordene por el tercero, luego por el segundo y finalmente por la clave principal).
Si no desea llamar a sort
dos veces, tendrá que escribir una función de key
más compleja. Algo como:
In [50]: def key(elem):
...: return elem[0], [-ord(c) for c in elem[1]]
In [51]: sorted(results, key=key, reverse=True)
Out[51]: [(10, ''George''), (10, ''Mary''), (9, ''Adam''), (9, ''Frank''), (9, ''John'')]
En particular, cada vez que tenga algo ordenado en orden lexicográfico (como cadenas, tuplas, listas, etc.), puede invertir el orden cambiando el signo a todos los elementos.
Si tengo una lista de tuplas:
results = [(''10'', ''Mary''), (''9'', ''John''), (''10'', ''George''), (''9'', ''Frank''), (''9'', ''Adam'')]
¿Cómo puedo ordenar la lista como podría ver en un marcador, de modo que clasifique la puntuación de mayor a menor, pero rompa los vínculos alfabéticamente por nombre?
Entonces después del género, la lista debería verse así:
results = [(''10'', ''George''), (''10'', ''Mary''), (''9'', ''Adam''), (''9'', ''Frank''), (''9'', ''John'')]
Por el momento, todo lo que puedo hacer es results.sort(reverse=True)
, pero los enlaces se revierten alfabéticamente también ...
Cualquier ayuda sería muy apreciada. ¡Gracias!
Solo usar sorted
debería ser suficiente
>>> sorted(results)
[(''10'', ''George''), (''10'', ''Mary''), (''9'', ''Adam''), (''9'', ''Frank''), (''9'', ''John'')]
la función cmp
predeterminada comprueba la precedencia de una tupla comparando cada miembro de la tupla, de 0 a n, en ese orden
sort
método de sort
acepta el parámetro de key
opcional.
clave especifica una función de un argumento que se utiliza para extraer una clave de comparación de cada elemento de la lista
Necesita convertir cadena en número:
>>> results = [(''10'', ''Mary''), (''9'', ''John''), (''10'', ''George''), (''9'', ''Frank''), (''9'', ''Adam'')]
>>> results.sort(key=lambda x: (int(x[0]), x[1]), reverse=True)
>>> results
[(''10'', ''Mary''), (''10'', ''George''), (''9'', ''John''), (''9'', ''Frank''), (''9'', ''Adam'')]
Puede tener un control muy granular sobre cómo ordenar cada uno de los valores en una tupla con el parámetro key
del método de sort
. Por ejemplo:
In [41]: results = [(''10'', ''Mary''), (''9'', ''John''), (''10'', ''George''), (''9'', ''Frank''), (''9'', ''Adam'')]
In [42]: results.sort(key=lambda (score, name): (-int(score), name))
In [43]: results
Out[43]:
[(''10'', ''George''),
(''10'', ''Mary''),
(''9'', ''Adam''),
(''9'', ''Frank''),
(''9'', ''John'')]