Python 使用特定条件对给定列表元素进行分组
我有一个包含5个多边形的列表,如下所示:Python 使用特定条件对给定列表元素进行分组,python,Python,我有一个包含5个多边形的列表,如下所示: from itertools import compress from shapely.geometry import Polygon polys = [<shapely.geometry.polygon.Polygon object at 0x000002D634217668> <shapely.geometry.polygon.Polygon object at 0x000002D634217780>
from itertools import compress
from shapely.geometry import Polygon
polys = [<shapely.geometry.polygon.Polygon object at 0x000002D634217668>
<shapely.geometry.polygon.Polygon object at 0x000002D634217780>
<shapely.geometry.polygon.Polygon object at 0x000002D6341F9080>
<shapely.geometry.polygon.Polygon object at 0x000002D634217FD0>
<shapely.geometry.polygon.Polygon object at 0x000002D634217F60>]
注意:poly.intersects在相交时返回true,否则返回false。这只是shapely在这里的用法。
编辑:
根据Aran Fey的评论:
在3个多边形的情况下,例如,[a,b,c]
,即使a
和c
不相交,b
也可能与a和c
相交
结果将是:
[[b,c], [b,a]]
我必须找到所有这样的团体。
因为多边形的顺序并不重要,所以也应该删除重复的组(包含相同的多边形)我唯一能想到的是迭代所有多边形,然后循环所有其他多边形以找到交点。(这意味着算法具有二次运行时复杂性。)效率低下,但它完成了任务
result = []
for i, shape in enumerate(polys):
intersected_shapes = [poly for poly in polys[i+1:] if shape.intersects(poly)]
if intersected_shapes:
intersected_shapes.append(shape)
result.append(intersected_shapes)
使用问题()中的输入[a,b,c]
,这将生成输出:
[[b, a], [c, b]]
因此,如果有3个多边形[a,b,c]
,并且a
与c
不相交,但是b
与a
和c
相交,结果应该是[[a,b,c]]
?即使a
和c
不相交,b
也可能与a
和c
相交。比如说,谢谢你的照片。是的,很抱歉我的错误。所以结果将是[[b,c],[b,a]],所以在我的问题中,我必须找到所有这样的组。顺便说一句,可能会得到重复的组?因为多边形的顺序并不重要,所以应该删除重复的组(包含相同的多边形)@ian我认为不会发生这种情况,不会。代码只在列表后面出现的多边形上循环(例如a
迭代b
和c
,但是b
只迭代c
,而c
根本不迭代),所以我不知道如何创建任何重复项。
[[b, a], [c, b]]