使用容差将列表分组到列表列表中,即使列表发生移动

问题描述 投票:0回答:1

我正在尝试比较矩形(或类似)面板的形状。 我将这些折线分解为具有线向量和曲线长度的元组列表。 现在我需要将每个列表与所有其他列表(长度不全相同,某些形状可能有 3 个边缘、4 个或更多)进行比较,并具有长度公差。

例如这个列表列表,容差为 0.1:

[[(vector1, 1.1), (vector2, 2.2), (vector3, 1.3), (vector4, 2.4)],
[(vector2, 2.3), (vector3, 1.4), (vector4, 2.5), (vector1, 1.2)],
[(vector1, 1.3), (vector2, 2.4), (vector3, 1.5), (vector4, 2.6)],
[(vector1, 5.1), (vector2, 6.4), (vector3, 5.5)]]

在这种情况下,前两个列表应该分组(即放入一个新列表中),即使 vector1 已移至第二个列表的末尾,它仍然是一个顺序相同且符合 0.1 容差的序列。第三和第四列表根本不应该分组(即具有单个项目的列表),因为它们不在任何其他列表的容差范围内。

重要:每个完整的元组列表都是一个项目。我将整个列表与整个列表进行比较,最后我将项目“i”分组。在此示例中,它将是:[[0,1],[2],[3]]

我遇到过 zip 的列表推导式,但这些要求所有列表的长度相等,并且还要求相交之类的东西:

c = sorted(set(a).intersection(b))

但是这些使用集,而在我的例子中,列表中的项目编号以及项目的顺序都很重要,即使发生了移位。

有什么想法吗? 谢谢!

python list compare
1个回答
0
投票

更新:我基本上通过暴力破解问题解决了它。我知道这在一个巨大的列表中会非常重,但对我来说它非常有效。首先,我确保所有曲线(长度)都按相同方向排序,然后在 for 循环中旋转列表

for range(0, len(list))
,然后将每个列表的每次迭代与原始列表进行比较。

如果旋转列表之一与原始列表匹配(math.isclose)(每个长度都在给定的公差范围内),我从原始列表列表中删除了该列表和匹配列表,然后使用更新后的列表再次运行循环.

希望这是有道理的

© www.soinside.com 2019 - 2024. All rights reserved.