Python中如何按从上到下、从左到右优先级排序XY坐标?
坐标排序问题解决方案
直接对(x,y)元组做默认排序不符合预期,核心原因是绘图区域的y轴方向和数学坐标系方向相反:画布中y值越小位置越靠上,默认元组排序优先比对x值,完全不符合「从上到下为第一优先级、同高度从左到右为第二优先级」的视觉排序逻辑。
排序规则
按照画布视觉顺序排序的判定逻辑:
- 第一排序维度:y坐标值升序,y越小的点位置越靠上,排序位次越靠前
- 第二排序维度:y值处于同一水平容差区间内的点,按x坐标值升序排列,x越小越靠左,位次越靠前
*如果你的归一化规则是y=0对应画布底部、y=1对应画布顶部,把y的排序方向改成降序即可。
代码实现
# 原始归一化坐标列表 coords = [ (0.48425699105850684, 0.4852200502470339), (0.8003207976544613, 0.1794844315136523), (0.663158173206857, 0.19739922702645016), (0.26770425263394393, 0.20288883507443173), (0.5214529814719886, 0.2032096846467844), (0.4768268032594222, 0.3875097802042241), (0.5400594055964151, 0.5870619715600098), (0.5445470099105095, 0.8064964338255158) ] # 无同高度容差的最简排序(适配你给出的这组无同行重叠的坐标) sorted_coords = sorted(coords, key=lambda point: (point[1], point[0]))
本组数据排序结果
运行上述代码后,得到的顺序完全匹配画布从上到下、从左到右的视觉呈现顺序:
- 最顶部点位:
(0.8003207976544613, 0.1794844315136523) - 第二位:
(0.663158173206857, 0.19739922702645016) - 第三位:
(0.26770425263394393, 0.20288883507443173) - 第四位:
(0.5214529814719886, 0.2032096846467844) - 第五位:
(0.4768268032594222, 0.3875097802042241) - 第六位:
(0.48425699105850684, 0.4852200502470339) - 第七位:
(0.5400594055964151, 0.5870619715600098) - 最底部点位:
(0.5445470099105095, 0.8064964338255158)
如果你的点位存在视觉上属于同一行、但y值有微小计算误差的情况,可以给y值做分桶处理,比如用
round(p[1]/0.05)*0.05作为第一排序key,把y差小于0.05的点归为同一行,再按x排序即可。
内容的提问来源于stack exchange,提问作者fortyTwo102
相关产品推荐
相关产品推荐

