2015-10-15 70 views
0

我想帶一個嵌套列表如何遞歸修改深層嵌套列表的每個值並返回另一個類似的列表?

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

進去遞歸,修改每個值,然後返回一個類似的列表。例如說,我想1添加到每個值輸出將

[[[2,3],[5,6]], 2, [2,4,5],[3,4,5]] 

我已經取得了一些進展與進行遞歸函數,其中我測試它是否是一個列表或修改元素這樣做。當談到如何再次編譯列表時,我很難過。沒有一個簡單的方法來做到這一點?以下代碼是我到目前爲止。

def add1(nodelist): 
    list_of_lists = [] 
    name_nodes.nodes = [] 
    def recurse_list(nodelist): 
     name_nodes.nodes = [] 
     edit_list = False 
     for r in nodelist: 
      if type(r) == list: 
       recurse_list(r) 
      else: 
       edit_list = True 
       name_nodes.nodes.append(r+1) 
     if edit_list == True: 
      list_of_lists.append(name_nodes.nodes) 
    recurse_list(nodelist) 
    return list_of_lists 

這段代碼獲得我下面的輸出

[[2, 3], [5, 6, 2], [2, 4, 5], [3, 4, 5], [3, 4, 5]] 

我很驚訝,有沒有某些模塊或一些內置的功能,以更好地處理嵌套列表,因爲有這麼多的問題,處理類似,但不同的行爲。我能找到的最接近的問題是here。但那只是我沒有找到的東西。感謝任何答案。

+0

「如果它是一個列表或修改的[sic]元素」 - 這不能總是以100%的方式在Python中完成。 –

回答

2
def add1(L): 
    for i, elem in enumerate(L): 
     if isinstance(elem, int): 
      L[i] += 1 
     else: 
      L[i] = add1(elem) 
    return L 

輸出:

>>> L = [[[1,2],[4,5]], 1, [1,3,4],[2,3,4]] 
>>> add1(L) 
[[[2, 3], [5, 6]], 2, [2, 4, 5], [3, 4, 5]] 
+0

這真是太美了,我要哭了。我做了一些修改。我將'L [i] + = 1'改爲'L [i] = func(elem)'並將'isinstance(elem,int)'改爲'not isinstance(elem,list)'在參數列表中添加了func將它重命名爲nmap。現在我可以輕鬆地更改嵌套列表。非常感謝! – raz

0

其實,我一直在思考這個最近。下面是我爲此編寫的代碼的一部分,摘自一些演示。函數nmap()的工作方式與內置函數map()相似,但它適用於嵌套列表。

import functools 


def mapper_nester(function): 
    @functools.wraps(function) 
    def wrapper(*point): 
     try: 
      res = function(*point) 
     except TypeError: 
      res = map(mapper_nester(function), *point) 
     return res 
    return wrapper 


def nmap(function, *seq): 
    """nmap(funtion, seq[, seq ...]) -> nested list of similar structure.""" 
    return map(mapper_nester(function), *seq) 

>>> nested_list = [0, [1], [[[[2]]]], 
        [3, [], [4, 5]], 
        [6, [7, 8], 
        9, [[[]], 10, []]], 11, 
        [], [], [12]] 
>>> nmap(lambda x: x + 1, nested_list) 
[1, 
[2], 
[[[[3]]]], 
[4, [], [5, 6]], 
[7, [8, 9], 10, [[[]], 11, []]], 
12, 
[], 
[], 
[13]] 

這是遍歷嵌套(遞歸)結構的遞歸函數。

優點:

缺點:

  • 它經受遞歸限制,所以對於深層嵌套的列表不是真的有用。
  • 在Python上下文中,遞歸函數通常是不被贊同的。
  • 該函數使用TypeError來檢查節點的「類型」(原子或原子集合),但這並不總是可靠的(並且取決於映射的函數實際執行的操作),特別是對於Python鴨子打字。

其實我已經寫了很多代碼來解決最後一個問題,但是把它放到這裏是相當麻煩的。[1]

[1]它做的是創建一個臨時的,有限的「類型宇宙」,它清楚地區分原子和原子集合(這是用醜陋的方式完成的,使用isinstance()和朋友,可以自定義這種「類型宇宙」的創建),然後將數據和待映射函數提升到這個宇宙中,其中提升函數只能作用於原子併產生原子作爲值。嵌套地圖在這個Universe中完成,然後結果可以選擇降級到通常的Python Universe。

相關問題