list_1 = [2, 7, 4, 5, 6, 1, 3, 8, 9] list_2 = [(1, 5), (2, 0), (3, 6), (4, 4), (5, 3), (6, 2), (7, 1), (8, 7), (9, 8)] Quiero reordenar la lista list_2 de modo que el primer elemento de cada tupla siga el orden especificado por list_1 , entonces:
list_2_ordered = [(2, 0), (7, 1), (4, 4), (5, 3), (6, 2), (1, 5), (3, 6), (8, 7), (9, 8)] Intento usar la función de map para mapear el filter sobre list_1 como iterables (la idea general map(filter(lambda x,j : x[0]==j, list_2),list_1) . Pero, por supuesto, no funciona (Creo que debido a un error de tipo) ¿Cómo puedo hacer esto con la menor cantidad de líneas de código?
Elabore un diccionario para mapear su orden de clasificación (la clave es su número y el valor el orden en list_1) y use sorted con una key personalizada que asignará el primer elemento al diccionario (y por lo tanto el orden esperado):
order = {k:v for v,k in enumerate(list_1)} list_2_ordered = sorted(list_2, key=lambda x: order.get(x[0], float('inf')))Producción:
[(2, 0), (7, 1), (4, 4), (5, 3), (6, 2), (1, 5), (3, 6), (8, 7), (9, 8)] NÓTESE BIEN. order.get con float('inf') como segundo parámetro para manejar el caso en el que el primer elemento no está presente en order . En este caso, la tupla se ordenará al final. Si usa -1 como valor predeterminado, esto ordenará las claves desconocidas al principio
Aquí hay una forma de obtener el resultado deseado en dos pasos:
(i) Cree el diccionario dic1 para buscar la posición de cada elemento en list1
(ii) Ordene list_2 por los primeros elementos usando sus posiciones en list_1 con el diccionario dic1
dic1 = {k:v for k,v in zip(list_1, range(len(list_1)))} list_2.sort(key = lambda x: dic1[x[0]]) print(list_2)Producción:
[(2, 0), (7, 1), (4, 4), (5, 3), (6, 2), (1, 5), (3, 6), (8, 7), (9, 8)]Si quieres hacerlo en la menor cantidad de líneas de código:
>>> list_2.sort(key=lambda t: list_1.index(t[0])) >>> list_2 [(2, 0), (7, 1), (4, 4), (5, 3), (6, 2), (1, 5), (3, 6), (8, 7), (9, 8)] Otras soluciones aquí que involucran la creación de un dict son más eficientes para listas grandes (esa llamada index es O (n) por lo que toma el tipo de O (n log n) a O (n ^ 2)), pero para una lista pequeña como esto, es probable que la diferencia sea insignificante.