2017-09-22 75 views
0

我需要將int插入到排序列表中。將int插入到排序後的多維列表中

這是我走到這一步:

def insert_in_list(x, tree, index=0): 
    if not tree: 
     return tree 
    elif x < tree[index]: 
     tree.insert(index, x) 
     return tree 
    else: 
     return insert_in_list(x, tree, index+1) 

這是工作的,例如所有的一維列表,[1,5,10]。但是,我需要它在包含附加列表的任何列表上工作,例如:[1,[5,7 [8,9,10]] 18,22]。

嘗試這樣做:

def insert_in_list(x, tree, index=0): 
    if not tree: 
     return x 
    elif isinstance(tree[0], list): 
     return [insert_in_list(x, tree[0])] + insert_in_list(x, tree[1:]) 
    elif x < tree[index]: 
     tree.insert(index, x) 
     return tree 
    else: 
     return insert_in_list(x, tree, index+1) 

然而,insert_in_list(4,[2,3,6],8,10]))返回[[[[2,3,4,6]]] ,4,8,10]。所以遞歸不會停止插入後第一4.幫助我出

+0

如何對列表進行排序?在'[0,1,3,[2,7,8],6,11]'中插入值'4'的位置?你難道不會誇大你的名單嗎? – mquantin

+0

這是在學校任務。所有提供的列表已經排序,從左到右依次遞增。所以你的例子是無關緊要的。但我必須返回列表「unflattened」! –

+0

如果回答了您的問題,請檢查它是否有效,否則請告訴我現在是什麼問題。 – mquantin

回答

0

這是因爲你需要告訴你的函數停止尋找x <項目時發現上限。
這是一個額外的信號(變量done),只要找到上限就會傳播。

def insert_in_list(x, tree, done = False): 
    for index, item in enumerate(tree): 
     if isinstance(item, list): 
      done = insert_in_list(x, item) 
     elif done: 
      return True 
     elif x < item: 
      tree.insert(index, x) 
      return True 

Additionnaly

  • 你不需要索引作爲參數,因爲你會在循環內插入,你的函數的其他實例並不需要知道最後一個索引。
  • 列表是可變的,所以即使您不將它作爲參數傳遞,它也是同樣的列表。