所以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
答案 0 :(得分:1)
想象一下t
是一个树形结构,如下所示:
[1, [3, [4], [5]], [2]]
||
1
/ \
3 2
/ \
4 5
你继续穿过树,探索每条路径。死胡同返回None
,因此if path
为False
为死胡同。当您找到要查找的路径时(例如,5),则返回[5]
。 path
不是None
,因此if path
为True
,因此您返回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: 1
,1: 0
),其中我们称之为:
findPath([3, [4], [5]], 5)
同样,t [0]不等于x
,因此我们将当前堆栈级别的索引增加到(0: 1
,1: 1
)并添加另一个堆栈级别以尝试(0: 1
,1: 1
,2: 0
),我们致电:
findPath([4], 5)
此处t[0]
不等于x
且t[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
)并重复这个过程;现在我们需要将[3,5]
追加到[1]
,因此我们得到[1,3,5]
。
这是否开始有意义?我在这里写了一个奇怪的符号,因为我不想花时间画画,但要真正理解这一点,你应该为自己画出堆栈级别。