2017-07-20 92 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]

這開始有意義嗎?我在這裏做了一個奇怪的符號,因爲我不想花時間畫圖片,但要真正理解這一點,你應該爲自己畫出堆棧層次。