所以我一直在使用Python中的这个小递归函数,我正在st脚。这是我到目前为止所拥有的以及我希望拥有的内容:
def search_things(things):
names = []
for thing in things:
if not thing.GetBoundaries():
names.append(thing)
else:
names.append(search_things(thing.GetBoundaries()))
return names
好的,在这种情况下,对此定义(事物)的输入将是FilledRegion对象的列表。每个对象都有它的边界,这正是我想要得到的。边界是CurveLoop可枚举对象,其中包含构成每个边界的曲线列表。
所以基本上如果我想了解曲线本身,我会选择一个填充区域并执行此操作:
boundaries = FilledRegion.GetBoundaries()
这将返回CurveLoop对象的列表。每个CurveLoop都包含一个曲线列表。
for loop in boundaries:
for curve in loop:
curves.append(curve)
这会让我得到我想要的曲线。有没有办法稍微修改原始功能?现在,因为GetBoundries()返回一个CurveLoop对象列表而不是曲线本身我得到一个错误,CurveLoop没有属性GetBoundaries。如何将曲线列表返回到每个填充区域的子列表中?
所以我走向了一个不同的方向。我无法将它全部包含在一个定义中,因此我创建了一些:
def process_list(_func, _list):
return map( lambda x: process_list(_func, x) if type(x)==list else _func(x), _list )
def ToDSType(item):
curves = []
for i in item:
curves.append(i.ToProtoType())
return curves
curves = []
for i in collector:
curves.append(process_list(ToDSType, i.GetBoundaries()))
有没有办法结合这些方法?我猜这是一个抽象的问题,因为你无法测试任何这些代码,但语法明智。 1."我"收集器中是一个填充区域对象 2. GetBoundaries()返回一个CurveLoop对象列表,它是可枚举(List)的曲线,所以我可以像列表一样迭代它们。这就是我在ToDSType方法中所做的事情。
答案 0 :(得分:0)
我不得不说这个问题对我来说太抽象了,但它看起来像是一个标准的树遍历。我建议阅读Python Algorithms,Traversal:Algorithmics的Skeleton Key(第5章)。有很多很好的解释例子。
Listing 5-2. Finding Connected Components
-----------------------------------------
def components(G): # The connected components
comp = []
seen = set() # Nodes we've already seen
for u in G: # Try every starting point
if u in seen: continue # Seen? Ignore it
C = walk(G, u) # Traverse component
seen.update(C) # Add keys of C to seen
comp.append(C) # Collect the components
return comp
对不完整的答案,没有声誉添加评论。