【发布时间】:2021-08-21 06:35:32
【问题描述】:
首先让我进一步解释一下我在问题中所说的内容。
我有一个包含矩形坐标的列表和这样的字符串:
list = [
(x0, y0, x1, y1, 'string 1'),
(x0, y0, x1, y1, 'string 2'),
(x0, y0, x1, y1, 'string 3')
]
我的目标是通过升序 y1 和升序 x0 对它们进行排序
现在我正在使用这种方法对它们进行排序:
from operator import itemgetter
list.sort(key=itemgetter(3, 0))
问题是有时 y1 坐标彼此相似,它们会弄乱字符串的读取顺序。
这是一个简单的例子:
有序列表:
[
(859.0005493164062, 155.95175170898438, 942.1799926757812, 267.6641845703125, 'apple'),
(797.2904663085938, 157.01016235351562, 824.2350463867188, 268.2728271484375, 'red'),
(717.056640625, 157.71969604492188, 754.2953491210938, 269.064697265625, 'The'),
(162.12901306152344, 345.8944091796875, 210.24722290039062, 381.1226806640625, 'is'),
(234.13601684570312, 346.3544006347656, 291.0986633300781, 381.9940185546875, 'trully'),
(313.343017578125, 347.2441101074219, 332.92852783203125, 382.7861328125, 'delicious'
]
如果我加入字符串,该短语将显示为“apple red The is trully delicious”,但它的意思是阅读“The red apple is trully delicious”。
我不能简单地颠倒顺序,或者先按 'x0' 排序,因为它会干扰列表中的其他元组并且更加混乱句子。
所以我想我正在寻找一个基于“y1”是否相似对元组进行分组的函数(我正在考虑做一个 if 'y'/'y' ~= 1 then group 但我知道如何处理两个以上的元组),然后按“x0”应用排序,最后将它们附加到一个新列表中。
感谢任何帮助!
编辑 1:尝试实现此功能:
import math
def round_down(n):
multiplier = 10
return math.floor(n/multiplier)*multiplier
这设法将坐标四舍五入到最低的十位,但也有坐标混乱。
我已经确定了我认为的问题。
这里有一些视觉帮助: 红色矩形是每个单词的边界框。绿线代表“y”坐标,在页面中下降时上升 10。蓝点是(x0, y0),紫点是(x1, y1)
问题在于蓝色和紫色的点最终位于绿线的不同侧。因为现在如果我将 'delicious' 的 'y1' 舍入到 180,如果我将 'y0' 舍入到 170。
所以现在我知道该诚实地做什么了。
也许创建一个更大的矩形,其中包含两个 'y1' 值之间的单词,对它们进行排序,然后移至下一组?
按照我最初的意图按类似的“y1”值分组也可以,因为我没有四舍五入任何值。
我真的不知道这些选项中的任何一个会如何工作,因为我在编程方面没有那么丰富的经验。因此,再次欢迎任何帮助!
【问题讨论】:
标签: python