sort objects lists lista code python sorting tuples reverse

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'')]