2010-04-28 67 views

回答

17

您可以压缩列表并对结果进行排序。排序元组时,默认情况下,应该排序第一个成员。

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

然后再解压它们:

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

谢谢!棒极了! – 2010-04-28 20:54:03

+2

或者,通过没有两个单独的列表来保持点正确关联,但保留元组列表。 – 2010-04-28 21:04:42

+1

阅读Mike Graham的回答。你也可以使用'zip'来解开元组。 – 2010-04-28 21:10:11

4

如果x和y的意思是一个单元(如一个点),它将使更多的意义将它们存储为元组而不是两个单独的列表。

无论如何,这里是你应该做的:

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

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

我会这样做,但matplotlib使用这样的列表 – 2010-04-28 20:55:09

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

如果你有大量的项目,你可能不想使用'zip(* sorted(...))'。参数拆包'*'不能像'zip(xs,ys)'那样有效地完成任务,因为它必须传递与列表中的元组相同数量的参数。 – 2010-04-28 21:13:29

10
>>> import numpy 

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

如果你能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

最后两行可以安全地组合为'xs,ys = [v [sorted_index] for v in [xs,ys]]'? – 2017-11-12 15:00:45