2017-07-20 89 views
0

因此,x是我在嵌套列表t中查找的值。我理解整个代码和列表理解会发生什么,我不明白的是[5]成为路径的哪一点,然后[3,5]成为路径,最后返回[1,3,5]以显示价值的最终路径。搜索任意嵌套列表并返回路径(Python)

def findPath(t, x): 
    if t[0] == x: 
     return [t[0]] 
    for path in [findPath(branch, x) for branch in t[1:]]: 
     if path: 
      return [t[0]] + path 

t = [1, [3, [4], [5]], [2]] 

findPath(t, 5) 
#returns [1,3,5] 
findPath(t, 2) 
#returns [1 ,2] 

这里是一个链接,让我了解到一步一步,我只是不明白的清单是如何成为最终返回[T [0] +路径的路径。 https://开头goo.gl/ZRrZv7

回答

1

想象t是一个树状结构,像这样:

[1, [3, [4], [5]], [2]] 

      || 

       1 
      / \ 
      3  2 
     /\ 
     4 5 

您保持向下遍历树,探索每一条路径。死角回传None,所以if pathFalse为死胡同。当你找到你要找的路径时(例如5),则返回[5]path不是None,所以if pathTrue,所以您返回t[0] + [5] = [3, 5]。同样,在上面的级别中,[3, 5]不是None,因此您返回t[0] + [3, 5] = [1, 3, 5]。如果找不到路径,则任何地方都不返回(准确地说,只返回None)。

对于第二个例子,下面是同样的推理。

0

我没有按照链接,因为我一般不遵循不常用网站的链接,但这里发生了什么的解释:

t = [1, [3, [4], [5]], [2]] 

在组级(0)我们拨打:

findPath(t, 5) 

这个计算结果为:

findPath([1, [3, [4], [5]], [2]], 5) 

我们站rt堆栈级别(0)通过检查t[0]。我们将用符号列表(<stack level><current index>)来表示此处,这里给出了我们(0: 0)。

此时,t[0]不等于x,所以我们通过if语句的非指定else条件并转到for循环的下一个迭代。我们增加在当前堆栈水平(0: 1)索引并添加另一个堆栈级(1),这给我们的(0: 11: 0)的状态,在这里我们称之为:

findPath([3, [4], [5]], 5) 

同样,T [0]不等于x,所以我们增加在当前堆栈水平(0: 11: 1)索引并添加另一个堆栈级尝试(0: 11: 12: 0),这让我们致电:

findPath([4], 5) 

这里t[0]不等于xt[1:]是空的,所以我们从堆栈级别降低到堆栈级别(1),并拿起我们离开的地方;我们将这个级别的计数器增加到(0: 1,1: 2),然后添加一个堆栈级别,这给了我们(0: 1,1: 2,2: 0)。这让我们打电话: findPath([5],5)

啊哈!现在t[0]等于x在最高的堆栈级别,所以我们构造[t[0]];这评估为[5]。然后,我们退回堆栈层,并从中断位置继续;我们在(0: 1,1: 2)。现在,findPath返回一个值,所以我们第一次进入if条件,而不是进入下一次迭代。所以我们在当前堆栈级别取t[0]并附加返回值;此评估将追加[5][3],这给了我们[3,5]。接下来,我们再次回落到(0: 1)并重复该过程;然后,我们再次回到(0: 1)并重复该过程;现在我们需要追加[3,5][1],所以我们得到[1,3,5]

这开始有意义吗?我在这里做了一个奇怪的符号,因为我不想花时间画图片,但要真正理解这一点,你应该为自己画出堆栈层次。