【问题标题】:Traversing arbitrarily nested lists遍历任意嵌套列表
【发布时间】:2017-07-20 01:39:07
【问题描述】:

所以 x 是我在嵌套列表 t 中寻找的值。我理解整个代码和列表理解发生了什么,我不明白的是 [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

【问题讨论】:

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


    【解决方案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)。

    您的第二个示例也遵循相同的推理。

    【讨论】:

      【解决方案2】:

      我没有关注该链接,因为我通常不关注非常用网站的链接,但以下是对所发生情况的解释:

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

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

      findPath(t, 5)
      

      计算结果为:

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

      我们通过检查 t[0] 来启动堆栈级别 (0)。我们将用符号 List(<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: 1,@ 987654341@, 2: 0),这让我们打电话:

      findPath([4], 5)
      

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

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

      接下来,我们再次退回到 (0: 1) 并重复该过程;现在我们需要将[3,5] 附加到[1],所以我们得到[1,3,5]

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

      【讨论】:

        猜你喜欢
        • 2019-08-22
        • 2015-05-16
        • 2015-12-06
        • 2021-09-19
        • 2021-10-30
        • 1970-01-01
        • 2016-10-14
        • 2012-11-11
        相关资源
        最近更新 更多