2012-03-27 170 views
0

可以说我有一个递归函数,可以在列表中创建列表。它返回沿着线的东西:递归函数

['a', ['b', ['c', ['d', []]]], 'z', []] 

让我们把这个列表LIST1

然后,我有一个函数,该列表中,并且清除它对于我来说,基本不除去z.Lets调用这个名单列表2

[a,b,c,d] 

我能做些什么,是叫我的第一功能和接收我的列表,然后(同时在Python壳)叫我清理功能上LIST1将其转换为列表2。我想要做的就是在LIST1返回时立即进行清理,基本上在我的清单生成器函数中进行清理操作。

我很困惑我应该如何调用一个函数来改变递归函数的结果而不用搞砸递归函数。

我不想进入我的代码的细节,因为它相当复杂并且嵌套很深,但是如果你想让我澄清,请提出问题。

如果它有助于将问题形象化,可以用简单的语言想象一下。我有一个函数返回一个值,我想要另一个函数来操作该值,但在第一个函数内。

干杯,

回答

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'] 

的 '扁平化' 功能来自这里:https://stackoverflow.com/a/2158532/16718

0

我可能失去了一些东西,但为什么不只是呼吁递归函数的最终结果的清理功能?例如

result = cleanup(recursive()) 
+0

我试过回报清理(resultlist),但我没有得到任何东西。 – Unknown 2012-03-27 07:42:23

+0

对不起,如果它含糊不清,但我被批评我的函数嵌套很差,而且我想知道在后者函数中,另一个函数的返回值调用另一个函数的一般概念是什么。 – Unknown 2012-03-27 07:46:36

+0

保留递归的非清理版本。在Python提示符下,@Daniel显示你的方式只调用一次'cleanup'。 – alexis 2012-03-27 10:37:27

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:] 

所以正如你所看到的Wind之后的结果非常好。

>>> UnWind(Wind(range(1,10))[0]) 
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9] 
+0

好的,这是一个很好的例子。我会如何强迫风在风中放松。 – Unknown 2012-03-27 09:04:11