2016-10-20 109 views
3

說我有一個列表:在Python中,如何返回一個任意嵌套元素的索引列表?

>>> nested=[[1, 2], [3, [4]]] 

我想獲得,將返回[1,1,0]如果我正在尋找4功能。如果指定的元素不在列表中,那麼它將返回一個空列表,[]

Nested可以有任何結構,所以我想某種類型的遞歸函數會是最好的,但是在控制結構的深度和寬度方面遇到困難。

這是工作的代碼,但沿線的我在想什麼:

def locate(x,element,loc=[0],counter=0): 
    for c,i in enumerate(x): 
     if isinstance(i,list): 
      locate(i,loc+[0],counter+1) 
     else: 
      loc[counter]=c 
      if i==element: return loc 

函數調用會是這個樣子:

>>> locate(nested,4) 
[1,1,0] 

遞歸函數可能不是最好的解決方案,但只是我的嘗試。

+2

您目前的解決方案有什麼問題?除了在遞歸時不回來。並使用默認的可變參數。 –

+1

即返回定位(我,祿+ [0],計數器+ 1)' –

+0

如果有多個匹配? –

回答

1
def nested_find(l, e): 
    for i, x in enumerate(l): 
     if isinstance(x, list): 
      t = nested_find(x, e) 
      if t: 
       return [i] + t 
     elif x == e: 
      return [i] 

這將返回None如果el

+1

僅供參考,'(x,list);'有一個分號 – LMc

+0

您是否介意提供關於它如何工作的更多解釋? – LMc

+0

@LMc當然。這遍歷列表中的每個元素,如果該元素本身就是一個列表,則在該列表上調用它自己。如果元素與我們正在查找的元素相同,我們會返回一個列表,其中包含最直接列表中的索引。然後,當我們退出遞歸調用時,我們添加列表的索引,該列表在某個級別包含我們正在尋找的內容。如果它沒有在列表中找到目標元素,它會在沒有返回語句的情況下到達結尾,並返回'None' –

3

你可能會考慮遷移到某種樹的數據結構來代替,但在這裏是您當前的數據結構的例子:

from collections import Iterable 

def flatten(collection, depth=()): 
    for i, element in enumerate(collection): 
     if isinstance(element, Iterable) and not isinstance(element, str): 
      yield from flatten(element, depth=depth + (i,)) 
     else: 
      yield element, depth + (i,) 

def locate(nested, element): 
    for v, indices in flatten(nested): 
     if v == element: 
      return indices 
0

繼如果未找到該元素,代碼將返回None,否則返回所需的輸出:

def locate(lst,ele): 
     return _locate(lst,ele,[]) 

    def _locate(lst,ele,res): 
     for i,x in enumerate(lst): 
      if isinstance(x,list): 
       retVal = locate(x,ele,res+[i]) 
       if retVal is not None: 
        return retVal 
      elif x==ele: 
       return res+[i] 
     return None 
相關問題