2010-04-28 9 views

risposta

17

È possibile comprimere gli elenchi e ordinare il risultato. Le tuple di ordinamento dovrebbero, per impostazione predefinita, ordinare sul primo membro.

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

E poi decomprimerli nuovamente:

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

grazie! è fantastico! –

+2

Oppure, mantenere i punti associati correttamente non avendo due elenchi separati, ma mantenendo l'elenco di tuple. –

+1

Leggi la risposta di Mike Graham. Puoi anche usare 'zip' per decomprimere le tuple. –

4

Se i xe y sono destinate ad essere una singola unità (ad esempio un punto), si avrebbe più senso per memorizzarli come tuple anziché due liste separate.

Indipendentemente da ciò, ecco che cosa si dovrebbe fare:

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

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

lo farei, ma matplotlib usa liste come quella –

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

Probabilmente non vuoi usare 'zip (* ordinato (...))' se hai un gran numero di elementi. L'argomento -unpacking '*' non può fare le cose con la stessa efficienza di 'zip (xs, ys)', dato che deve passare tanti argomenti quante sono le tuple nella 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] 

se si può lavorare 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

è possibile combinare in modo sicuro le ultime 2 righe come 'xs, ys = [v [sorted_index] per v in [xs, ys]]'? –