2012-12-07 29 views
0

我與nltk.tree.ParentedTree的一個實例的工作,但我覺得這個問題比這更普遍。德爾運營商在任意嵌套表

基本上,我有任意深度嵌套的名單,我想刪除列表中的一部分(雖然我不知道,部分是如何深深嵌套)。我有一個search功能在列表中查找一個項目,它返回的n整數,其中n是被發現的元素的深度元組的發生。

例如,假設我有l = [[['cat', 'dog']], ['fish']]當我致電search(l, 'dog')時,它返回(0, 0, 1)。這是告訴我l[0][0][1] == 'dog'。如果我知道'dog'發生在(0, 0, 1)時間提前,我可以做del l[0][0][1]從列表中刪除。但我不知道,所以我需要以編程方式做同樣的事情。

我可以通過做

indices = search(l, 'dog') 
for i in indices: 
    l = l[i] 

所以現在l'dog'訪問列表元素'dog'。但是,我不確定如何從列表中刪除它。我不只是想將它設置爲None

回答

3

你也可以遍歷所有,但最後的引用,然後使用最後一個刪除的項目:

obj = l 
for index in indices[:-1]: 
    obj = obj[index] 
del obj[indices[-1]] 

通過使用所有,但最後一個索引,你解決了參考的被引用的項目,所以現在你可以用最後一個索引刪除它。

1

嘗試:

del reduce(lambda cur, ind: cur[ind], index_list[:-1], l)[index_list[-1]] 

這僅僅是一個做什麼@Martijn皮特斯建議在他的回答更華麗的方式。

+0

'S /發燒友/醜陋和比較繞口/'。一行和函數式編程並不總是更好。 – delnan

+0

我認爲醜陋和令人費解的是在旁觀者的眼睛,因爲它代表了相當類似的語句幾乎相同的邏輯,但我會給予它更神祕的,因爲它不是基本語法的用法正好。 –