Ordenar una lista en Python usando el resultado de ordenar otra lista

Tengo las dos listas en Python

list_1 = [5, 2, 8]; list_2 = ['string1', 'string2', 'string3'] 

Me gustaría ordenar la primera lista y usar el resultado para ordenar la segunda lista.

En otras palabras, el resultado debe ser:

 # Sorted in descending order list_1_sorted = [8, 5, 2]; list_2_sorted = ['string3', 'string1', 'string2']; 

Sé cómo ordenar cada una de estas listas individualmente, pero ¿cómo puedo permutar una lista utilizando la permutación de los índices resultantes de la clasificación de la otra lista?

Transformada de Schwartzian

 list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2), key=operator.itemgetter(0), reverse=True)) 

Comprima las listas juntas, ordene, descomprima las listas:

 together = zip(list_1, list_2) sorted_together = sorted(together) list_1_sorted = [x[0] for x in sorted_together] list_2_sorted = [x[1] for x in sorted_together] 

Lo que sucede aquí es que zip crea una lista de tuplas, con los elementos que desea que la lista se ordene por ser los primeros elementos:

 >>> a = [1,3,7,3,2] >>> b = ["one","two",'three','four','five'] >>> zip(a,b) [(1, 'one'), (3, 'two'), (7, 'three'), (3, 'four'), (2, 'five')] 

Luego, cuando los ordenas, los elementos permanecen emparejados:

 >>> sorted(zip(a,b)) [(1, 'one'), (2, 'five'), (3, 'four'), (3, 'two'), (7, 'three')] 

Entonces todo lo que queda es desempaquetar estas listas.

Puedes usar zip :

 >>> list_1 = ['string1', 'string2', 'string3'] >>> list_2 = [5, 2, 8] >>> s = sorted(zip(list_2, list_1), reverse=True) >>> list_1_sorted = [e[1] for e in s] >>> list_2_sorted = [e[0] for e in s] >>> list_1_sorted ['string3', 'string1', 'string2'] >>> list_2_sorted [8, 5, 2] >>> 

La respuesta de @ Ignacio es la mejor, pero en caso de que necesite ordenar las listas in situ sin hacer nuevas listas, puede intentar esto:

 import itertools list_enumerate = itertools.count() list_2.sort(reverse=True, key=lambda k: list_1[next(list_enumerate)]) list_1.sort(reverse=True) print list_1 print list_2 

Tenga en cuenta que no creo que exista ninguna garantía de que se llame a la función key para cada elemento de la lista en orden (lo cual es necesario para que esto funcione), por lo que es un método riesgoso de usar.