我正在使用python中的几何项目,我遇到了一个有趣的问题。假设我有一个像这样的笛卡尔坐标列表:
[[1, 0], [3, 0], [2, 1], [3.5, 2], [4, 3], [6, 1], [6.5, 0], [10, 2], [10, 5], [9, 3.5], [7, 3], [9, 7], [7, 8], [5, 7], [4, 5], [2, 8], [1, 7], [0, 5], [1, 3], [0, 2]]
如果两个坐标存在相同的y值,那么通过降低y值对这个列表进行排序的最佳方法是什么?增加x值?输出应为:
[[2, 8], [7, 8], [1, 7], [5, 7], [9, 7], [0, 5], [4, 5], [10, 5], [9, 3.5], [1, 3], [4, 3], [7, 3], [0, 2], [3.5, 2], [10, 2], [2, 1], [6, 1], [1, 0], [3, 0], [6.5, 0]]
答案 0 :(得分:4)
您可以向list.sort
提供关键功能,以确定列表中每个项目应映射到哪个值以进行排序。在您的情况下,您可以使用负Y坐标的元组和X坐标来获得所需的结果:
>>> coordinates = [[1, 0], [3, 0], [2, 1], [3.5, 2], [4, 3], [6, 1], [6.5, 0], [10, 2], [10, 5], [9, 3.5], [7, 3], [9, 7], [7, 8], [5, 7], [4, 5], [2, 8], [1, 7], [0, 5], [1, 3], [0, 2]]
>>> coordinates.sort(key=lambda x: (-x[1], x[0]))
>>> coordinates
[[2, 8], [7, 8], [1, 7], [5, 7], [9, 7], [0, 5], [4, 5], [10, 5], [9, 3.5], [1, 3], [4, 3], [7, 3], [0, 2], [3.5, 2], [10, 2], [2, 1], [6, 1], [1, 0], [3, 0], [6.5, 0]]
答案 1 :(得分:2)
在大多数情况下,Poke的答案是正确答案。
如果您在Python 2.4之前在Python上执行此操作,或者比较功能非常昂贵,您可以使用Decorate-Sort-Undecorate(DSU或Schwartzian transform)
>>> coord = [[1, 0], [3, 0], [2, 1], [3.5, 2], [4, 3], [6, 1], [6.5, 0], [10, 2], [10, 5], [
9, 3.5], [7, 3], [9, 7], [7, 8], [5, 7], [4, 5], [2, 8], [1, 7], [0, 5], [1, 3], [0, 2]]
>>> decorated=[[(-y,x),x,y] for x,y in coord]
>>> [[x,y] for t,x,y in sorted(decorated)]
[[2, 8], [7, 8], [1, 7], [5, 7], [9, 7], [0, 5], [4, 5], [10, 5], [9, 3.5], [1, 3], [4, 3], [7, 3], [0, 2], [3.5, 2], [10, 2], [2, 1], [6, 1], [1, 0], [3, 0], [6.5, 0]]
或者:
>>> [[x,y] for t,x,y in sorted([[(-y,x),x,y] for x,y in coord])]
[[2, 8], [7, 8], [1, 7], [5, 7], [9, 7], [0, 5], [4, 5], [10, 5], [9, 3.5], [1, 3], [4, 3], [7, 3], [0, 2], [3.5, 2], [10, 2], [2, 1], [6, 1], [1, 0], [3, 0], [6.5, 0]]
这些技术(以及更多)在Python sorting HowTo
中答案 2 :(得分:0)
使用sorted
并使用元组指定带lambda
函数的排序条件:
>>> coord = [[1, 0], [3, 0], [2, 1], [3.5, 2], [4, 3], [6, 1], [6.5, 0], [10, 2], [10, 5], [9, 3.5], [7, 3], [9, 7], [7, 8], [5, 7], [4, 5], [2, 8], [1, 7], [0, 5], [1, 3], [0, 2]]
>>> sorted(coord, key=lambda x: (-x[1], x[0]))
[[2, 8], [7, 8], [1, 7], [5, 7], [9, 7], [0, 5], [4, 5], [10, 5], [9, 3.5], [1, 3], [4, 3], [7, 3], [0, 2], [3.5, 2], [10, 2], [2, 1], [6, 1], [1, 0], [3, 0], [6.5, 0]]
lambda函数元组中的顺序定义了考虑标准的顺序。
x [1]:按升序排序第二个元素
-x [1]:按降序排列第二个元素
x [0]:按升序排序第一个元素