Cuando queremos ordenar una lista de tuplas, donde cada tupla es de longitud 3 (todas en aumento), corregimos el siguiente código
ts = [(7, 14, 5), (3, 12, 9), (20, 22, 8), (20, 23, 24), (3, 12, 8), (4, 5, 7), (4, 5, 6), (4, 22, 17)]
ts.sort(key=lambda t: (t[0], t[1], t[2]))
Con esto quiero decir, que inicialmente se comparan los elementos en la posición cero, baje el elemento cero en una tupla, cuanto más cerca esté del principio. Si dos tuplas tienen el mismo valor en la posición cero, el elemento con el segundo elemento inferior estaría más cerca de la izquierda. Si dos tuplas tienen el mismo segundo elemento, se consideran terceros elementos en una tupla.
Entonces, la salida del código anterior es
Output: [(3, 12, 8), (3, 12, 9), (4, 5, 6), (4, 5, 7), (4, 22, 17), (7, 14, 5), (20, 22, 8), (20, 23, 24)]
Pero, ¿qué sucede si quiero revertir el orden en algunos casos (no en todos), por ejemplo, comparar los primeros elementos, y si una tupla tiene un primer elemento más pequeño , está antes en la lista ordenada? Pero si los primeros elementos son iguales, la tupla con el primer elemento más grande estaría al principio de la lista. Y si los segundos elementos de una tupla son iguales, la tupla con el primer elemento más grande estaría al principio de la lista.
Esto también podría describirse como:
Primero considere los primeros elementos en una tupla, ordénelos en orden creciente
Si los primeros elementos de una tupla son iguales, ordénelos en orden decreciente
Si los segundos elementos de una tupla son iguales, ordénelos en orden decreciente
Entonces, la entrada que proporcioné debería ser
Output: [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5), (20, 23, 24), (20, 22, 8)]
Quiero saber si esto se puede hacer usando una función lambda o si tiene que haber un método separado para la clasificación deseada.
También podemos generalizar este problema a una tupla de longitud n. ¿Qué pasa si tenemos una lista de longitud n como
('increasing', 'decreasing', 'decreasing', ..., 'increasing', 'decreasing')
Esto significaría:
Primero considere los primeros elementos en una tupla, ordénelos en orden creciente
Si los primeros elementos de una tupla son iguales, ordénelos en orden decreciente
Si los segundos elementos de una tupla son iguales, ordénelos en orden decreciente
Si los elementos en la posición n - 2 en una tupla son iguales, ordénelos en orden creciente
si los elementos en la posición n - 1 en una tupla son iguales, ordénelos en orden decreciente
Me alegraría ver la solución al problema de las tuplas de longitud 3 y la discusión del problema generalizado, donde la longitud de una tupla es n.
Puede cambiar los signos en los valores de las tuplas para obtener el comportamiento esperado:
ts.sort(key=lambda t: (t[0], -t[1], -t[2]))
print(ts)
# [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5),
# (20, 23, 24), (20, 22, 8)]
Para el caso general, puede asignar la increasing', 'decreasing'...
lista a canciones y zip
cada tupla key
con los signos como:
l = ('increasing', 'decreasing', 'decreasing')
d = {'increasing':1, 'decreasing':-1}
signs = [d[i] for i in l]
ts.sort(key = lambda x: tuple(i*sign for sign,i in zip(signs, x)))
Lo que produciría lo mismo que el anterior:
print(ts)
# [(3, 12, 9), (3, 12, 8), (4, 22, 17), (4, 5, 7), (4, 5, 6), (7, 14, 5),
# (20, 23, 24), (20, 22, 8)]
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras