Ho due liste: una contiene un insieme di punti x, l'altra contiene punti y. Python in qualche modo riesce a mescolare i punti x, o l'utente potrebbe. Avrei bisogno di ordinarli dal più basso al più alto e spostare i punti y per seguire i corrispondenti x. Sono in due liste separate .. come faccio?Python: ordina una lista e modifica un'altra di conseguenza
risposta
È 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]
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)
lo farei, ma matplotlib usa liste come quella –
>>> 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)
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. –
>>> 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]
è possibile combinare in modo sicuro le ultime 2 righe come 'xs, ys = [v [sorted_index] per v in [xs, ys]]'? –
grazie! è fantastico! –
Oppure, mantenere i punti associati correttamente non avendo due elenchi separati, ma mantenendo l'elenco di tuple. –
Leggi la risposta di Mike Graham. Puoi anche usare 'zip' per decomprimere le tuple. –