遍历任意嵌套列表

时间:2017-07-20 01:39:08

标签: python list recursion list-comprehension nested-lists

所以x是我在嵌套列表中寻找的值。我理解整个代码和列表理解会发生什么,我不明白的是[5]在什么时候成为路径,然后[3,5]成为路径,最后[1,3,5]返回显示最终的价值观。

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

2 个答案:

答案 0 :(得分: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)。

第二个例子也是如此。

答案 1 :(得分:0)

我没有关注该链接,因为我通常不会关注不适用于常用网站的链接,但这里是对所发生情况的解释:

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

在堆栈级别(0),我们调用:

findPath(t, 5)

评估结果为:

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

我们通过检查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: 11: 2),然后添加堆栈级别,这会给我们(0: 11: 22: 0) 。这让我们称之为:     findPath([5],5)

啊哈!现在t[0]在最高堆栈级别等于x,因此我们构造[t[0]];这评估为[5]。然后我们回到堆栈水平,然后继续我们离开的地方;我们在(0: 11: 2)。现在findPath返回一个值,所以我们第一次处于if条件而不是下降到下一次迭代。所以我们在当前堆栈级别取t[0]并将返回值附加到它;这会评估将[5]追加到[3],这会给我们[3,5]

接下来,我们再次回到(0: 1)并重复这个过程;现在我们需要将[3,5]追加到[1],因此我们得到[1,3,5]

这是否开始有意义?我在这里写了一个奇怪的符号,因为我不想花时间画画,但要真正理解这一点,你应该为自己画出堆栈级别。