Ordenar una lista de tuplas en un orden diferente según los valores de una tupla

vnikonov_63

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.

yatu

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 zipcada tupla keycon 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Ordenar un elemento en una lista de tuplas en los valores de un diccionario con Python

Ordenar una lista de tuplas en orden consecutivo

Cree una matriz de índices de valores a partir de una secuencia de tuplas cuando los valores en cada posición en las tuplas sean de una lista diferente

Convierta una lista de tuplas en un diccionario, dando a cada tupla una clave diferente

¿Cómo ordenar una lista / tupla de listas / tuplas por elemento en un índice dado?

Ordenar el diccionario según los valores de una lista

Ordenar estructuras en una lista vinculada según los valores de dos campos

Eliminar tuplas repetidas de una lista, según los valores de las tuplas

Cómo imprimir cada elemento en una tupla de tuplas en diferente orden

Busque elementos en una lista según los elementos de otra lista de un tipo diferente

Encuentre un elemento por tupla interna en una lista de una tupla de tuplas

Eliminar duplicados de una lista de tuplas según uno de los valores

Ordenar una lista en un comparador de orden específico

Ordenar una lista según los índices de una cadena

¿Cómo ordenar una lista de tuplas por segundo término en orden ascendente?

¿Hay algún atajo en Python para hacer una lista de tuplas en un orden determinado?

Ordenar un objeto según los valores enteros de propiedad en orden descendente

Transforma un mapa de valores en una lista de tuplas

C # cómo reordenar una tupla de lista según los valores

ordenar el orden de los marcos de datos en una lista de marcos de datos en función de un valor en cada marco de datos

Convertir un elemento de una tupla en una lista de tuplas

relación entre valores de tupla en una lista según su posición

relación entre valores de tupla en una lista según su posición

Actualizar una lista de tuplas si aparece un valor en un conjunto diferente de tuplas

Dividir una lista de tuplas en varias listas por los mismos elementos de tupla

¿Cómo acumular todos los valores en el índice de tuplas n, de una lista de tuplas?

¿Cómo acumular todos los valores en el índice de tuplas n, de una lista de tuplas?

Convierta cadenas en un archivo de texto (ya en formato de tupla) a una lista de tuplas

Ordenar listas en una lista anidada según el orden de argumentación de la lista 0

TOP Lista

CalienteEtiquetas

Archivo