所以我一直在Python中处理这个小的递归函数,并且我正在被踩踏。这里是我到目前为止,我想什么有:递归函数Python
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.收集器中的“i”是一个填充区域对象 2. GetBoundaries()返回CurveLoop对象的列表,它是可枚举的(List)曲线,所以我可以像列表一样迭代它们。这就是我在ToDSType方法中所做的。
请问您还可以添加至少其他类的骨架(曲线,CurveLoop,边界,...?)所以它是一个有点抽象。 – Juergen 2015-02-08 17:30:30
如果没有正确定义类/结构,就很难阅读和理解这个问题。我认为发布至少一个错误堆栈跟踪会有所帮助。而且,我能够发现一个问题;你的逻辑在这里是错误的:“如果不是getBoundaries:那么names.append(thing)else names.append(EntireListOfThingsThruRecursion)”。它应该是:'else:names = names + search_things(things.getBoundaries())' – SuperSaiyan 2015-02-08 17:32:47
你在这里描述的看起来是这样的,不知道其他类:你得到错误的对象和thing.GetBoundaries()不起作用 - >你的for循环“在事物中”是不正确的。你可能会认为,“事物”(你能改变名称“东西”只是为了广泛!)有一个特殊的方法为曲线创建一个迭代器。 – Juergen 2015-02-08 17:35:02