2010-04-28 13 views
15

Tengo dos listas: una contiene un conjunto de x puntos, la otra contiene y puntos. Python de alguna manera logra mezclar los puntos x, o el usuario podría. Tendría que ordenarlos de menor a mayor, y mover los puntos y para seguir a sus x corresponsales. Están en dos listas separadas ... ¿cómo lo hago?Python: clasifique una lista y cambie otra por consiguiente

Respuesta

17

Puede comprimir las listas y ordenar el resultado. La ordenación de tuplas debe, por defecto, clasificar al primer miembro.

>>> xs = [3,2,1] 
>>> ys = [1,2,3] 
>>> points = zip(xs,ys) 
>>> points 
[(3, 1), (2, 2), (1, 3)] 
>>> sorted(points) 
[(1, 3), (2, 2), (3, 1)] 

Y luego para desempaquetar de nuevo:

>>> sorted_points = sorted(points) 
>>> new_xs = [point[0] for point in sorted_points] 
>>> new_ys = [point[1] for point in sorted_points] 
>>> new_xs 
[1, 2, 3] 
>>> new_ys 
[3, 2, 1] 
+0

gracias! ¡Eso es genial! –

+2

O bien, mantenga los puntos asociados correctamente al no tener dos listas separadas, pero manteniendo la lista de tuplas. –

+1

Lee la respuesta de Mike Graham. También puede usar 'zip' para descomprimir las tuplas. –

4

Si las X y las Y están destinados a ser una sola unidad (como un punto), que tendría más sentido para almacenarlos como tuplas en lugar de dos listas separadas.

pesar de todo, esto es lo que debe hacer:

x = [4, 2, 5, 4, 5,…] 
y = [4, 5, 2, 3, 1,…] 

zipped_list = zip(x,y) 
sorted_list = sorted(zipped_list) 
+1

lo haría, pero matplotlib usa listas como esa –

16
>>> xs = [5, 2, 1, 4, 6, 3] 
>>> ys = [1, 2, 3, 4, 5, 6] 
>>> xs, ys = zip(*sorted(zip(xs, ys))) 
>>> xs 
(1, 2, 3, 4, 5, 6) 
>>> ys 
(3, 2, 6, 4, 1, 5) 
+4

Probablemente no desee usar 'zip (* sorted (...))' si tiene una gran cantidad de elementos. El argumento-desempaquetar '*' no puede hacer cosas tan eficientemente como 'zip (xs, ys)', ya que tiene que pasar tantos argumentos como tuplas tenga en la lista. –

10
>>> import numpy 

>>> sorted_index = numpy.argsort(xs) 
>>> xs = [xs[i] for i in sorted_index] 
>>> ys = [ys[i] for i in sorted_index] 

si se puede trabajar con numpy.array

>>> xs = numpy.array([3,2,1]) 
>>> xs = numpy.array([1,2,3]) 
>>> sorted_index = numpy.argsort(xs) 
>>> xs = xs[sorted_index] 
>>> ys = ys[sorted_index] 
+0

¿pueden las 2 últimas líneas combinarse de forma segura como 'xs, ys = [v [sorted_index] para v en [xs, ys]]'? –

Cuestiones relacionadas