假设我有一个递归函数,可以在列表中创建列表。它返回的内容如下:
['a', ['b', ['c', ['d', []]]], 'z', []]
让我们将此列表称为LIST1
然后我有一个获取该列表的函数,并为我清理它,基本上删除了z.Lets调用此列表LIST2
[a,b,c,d]
我可以做的是调用我的第一个函数并接收我的列表,然后(在python shell中)调用LIST1上的清理函数将其转换为LIST2。我想要做的是在LIST1返回后立即进行清理操作,基本上在我的列表生成器功能中进行清理操作。
我很困惑我应该如何调用一个函数来改变递归函数的结果,而不会搞砸递归函数。
我不想详细讨论我的代码,因为它相当复杂且嵌套很多,但如果你想让我澄清一下,请提出问题。
如果它有助于可视化问题,可以用更简单的术语来设想。我有一个返回值的函数,我想要另一个函数来操作该值,但是在第一个函数中。
干杯,
答案 0 :(得分:1)
这是你想要做的吗?
import collections
result = ['a', ['b', ['c', ['d', []]]], 'z', []]
def get_result() :
for r in result :
yield r
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
for sub in flatten(el):
yield sub
else:
yield el
def remove_z(l) :
for i in l :
if i != 'z' :
yield i
print [ l for l in remove_z(flatten(get_result()))]
结果是
['a', 'b', 'c', 'd']
'flatten'功能来自:https://stackoverflow.com/a/2158532/16718
答案 1 :(得分:0)
我可能会遗漏一些东西,但为什么不在递归函数的最终结果上调用清理函数呢?例如
result = cleanup(recursive())
答案 2 :(得分:0)
除非您提供有关递归函数和清理函数的更多详细信息,否则很难解决您的问题
然而,我设计了一个微不足道的例子,可能与你目前正在做的类似。正如你所看到的那样,正如@Daniel所提到的,嵌套调用确实按照它应该的方式运行
以下是示例
鉴于
>>> def Wind(p):
if not p:
return []
return [p[:1] + Wind(p[1:-1])+p[-1:]]
>>> Wind(range(1,10))
[[1, [2, [3, [4, [5, 5], 6], 7], 8], 9]]
和
>>> def UnWind(p):
if not p:
return []
return p[:1] + UnWind(p[1:-1][0])+p[-1:]
因此你会看到风之后UnWind的效果非常好。
>>> UnWind(Wind(range(1,10))[0])
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9]