Python clasificando dos listas

Estoy tratando de ordenar dos listas juntas:

list1 = [1, 2, 5, 4, 4, 3, 6] list2 = [3, 2, 1, 2, 1, 7, 8] list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2)))) 

De todos modos, haciendo esto me da salida.

 list1 = [1, 2, 3, 4, 4, 5, 6] list2 = [3, 2, 7, 1, 2, 1, 8] 

aunque me gustaría mantener el orden inicial de igual número 4 en la primera lista: lo que quiero es

 list1 = [1, 2, 3, 4, 4, 5, 6] list2 = [3, 2, 7, 2, 1, 1, 8] 

¿Que tengo que hacer? No quisiera usar el bucle para clasificar las burbujas. Cualquier ayuda apreciada.

Use un parámetro key para su ordenación que solo compare el primer elemento del par. Como la clasificación de Python es estable, esto garantiza que el orden de los segundos elementos seguirá siendo el mismo cuando los primeros elementos sean iguales.

 >>> from operator import itemgetter >>> [list(x) for x in zip(*sorted(zip(list1, list2), key=itemgetter(0)))] [[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 

Lo que equivale a:

 >>> [list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))] [[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]] 

El truco aquí es que cuando Python hace comparaciones de tuplas, compara los elementos en orden de izquierda a derecha (por ejemplo, (4, 1) < (4, 2) , que es la razón por la que no recibe el pedido. quiero en tu caso particular). Eso significa que debe pasar un argumento key a la función sorted que le indica que solo use el primer elemento de la tupla de pares como su expresión de clasificación, en lugar de la tupla completa.

Esto está garantizado para conservar el orden que desee porque:

Se garantiza que los tipos son estables. Eso significa que cuando varios registros tienen la misma clave, se conserva su orden original.

(fuente)

 >>> list1 = [1, 2, 5, 4, 4, 3, 6] >>> list2 = [3, 2, 1, 2, 1, 7, 8] >>> >>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))) >>> >>> print list1 [1, 2, 3, 4, 4, 5, 6] >>> print list2 [3, 2, 7, 2, 1, 1, 8] 

En el código, la clasificación se realiza basándose en los elementos primero y segundo de las tuplas, de modo que los elementos de la segunda lista resultantes están en el orden ordenado para los mismos elementos de la primera lista.

Para evitar la clasificación basada en la segunda lista, solo especifique que solo los elementos de la primera lista deben usarse en la comparación de las tuplas:

 >>> from operator import itemgetter >>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2),key=itemgetter(0)))) >>> list1, list2 ([1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]) 

itemgetter(0) toma el primer elemento de cada tupla, que pertenece a la primera lista.