对列表中的元素进行分组

Grouping elements in a list

我正在努力在任何图像上加入虚线。我已经提取并过滤了数据样本。

这是我的输入数据。在此字典中,键“0”和“1”表示 x 坐标,列表(值)表示相应 x 坐标的不同 y 坐标。

在不同y坐标的列表中,我想创建一个子列表并存储所有两个连续元素之间的差异小于35的元素。如果两个元素之间的差异超过35,那么我想创建一个新的子列表并对下一个连续元素重复相同的操作。

data = {0: [177, 188, 201, 209, 226, 233, 250, 258, 273, 282, 299, 307, 323, 330, 347, 355, 370, 379, 395, 403, 420, 428, 444, 452, 468, 476, 492, 500, 517, 524, 541, 549, 565, 573, 589, 597, 613, 621, 637, 651, 753, 761, 776], 1: [477, 489, 490]}

所以输出看起来像这样。

data = {0: [[177, 188, 201, 209, 226, 233, 250, 258, 273, 282, 299, 307, 323, 330, 347, 355, 370, 379, 395, 403, 420, 428, 444, 452, 468, 476, 492, 500, 517, 524, 541, 549, 565, 573, 589, 597, 613, 621, 637, 651], [753, 761, 776]], 1: [[477, 489, 490]]}

我怎样才能达到预期的输出?

对于一维“分组”:

def groupwhile(xs, key):
    group = []
    xs = sorted(xs)
    it = iter(xs)
    group.append(next(it))
    for x in it:
        if key(group[-1], x):
            group.append(x)
        else:
            yield group
            group = [x]
    yield group
>>> dist_10 = lambda a, b: abs(a - b) <= 10
>>> list(groupwhile([0, 7, 18, 19], key=dist_10))
[[0, 7], [18, 19]]

对于 2D 分组,您需要一些更高级的东西来获得高效的算法。既然你提到你正在处理图像,请尝试沿着图像形态学、floodfills、分水岭或聚类的方向。