2010-04-28 17 views
15

Ich habe zwei Listen: eine enthält eine Reihe von x Punkten, die andere enthält y Punkte. Python schafft es irgendwie, die x Punkte zu vermischen, oder der Benutzer könnte. Ich müsste sie nach dem niedrigsten bis zum höchsten sortieren und die y-Punkte verschieben, um ihren x-Korrespondenten zu folgen. Sie sind in zwei separaten Listen. Wie mache ich das?Python: Sortieren Sie eine Liste und ändern Sie eine andere

Antwort

17

Sie könnten die Listen zippen und das Ergebnis sortieren. Das Sortieren von Tupeln sollte standardmäßig nach dem ersten Element sortiert werden.

>>> 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)] 

Und dann, sie wieder zu entpacken:

>>> 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

Sie danken arbeiten können! das ist großartig! –

+2

Oder halten Sie die Punkte richtig verbunden, indem Sie nicht zwei separate Listen haben, sondern die Liste der Tupel behalten. –

+1

Lesen Sie Mike Grahams Antwort. Sie können auch 'zip' verwenden, um die Tupel zu entpacken. –

4

Wenn die x und die y eine einzige Einheit (wie zum Beispiel ein Punkt) sein sollen, wäre es sinnvoll, sie zu speichern, wie Tupel statt zwei separate Listen.

, ist Unabhängig hier, was Sie tun sollten:

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

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

Ich würde das tun, aber Matplotlib verwendet solche Listen –

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

Sie möchten wahrscheinlich nicht 'zip (* sortiert (...))' verwenden, wenn Sie eine große Anzahl von Elementen haben. Das Argument entpacken '*' kann nicht so effizient wie 'zip (xs, ys)' arbeiten, da es so viele Argumente wie Tupel in der Liste übergeben muss. –

10
>>> import numpy 

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

, wenn Sie mit 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

können die letzten 2 Zeilen sicher kombiniert werden als 'xs, ys = [v [sorted_index] für v in [xs, ys]]'? –

Verwandte Themen