我正在使用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]
,我可以通过执行'dog'
从列表中删除它。但我不知道提前知道,所以我需要以编程方式做同样的事情。
我可以通过
访问列表中的元素indices = search(l, 'dog')
for i in indices:
l = l[i]
l
所以现在'dog'
是None
。但是,我不知道如何从那里删除它从列表中删除它。我不只是想将其设置为{{1}}。
答案 0 :(得分:3)
您可以遍历除最后一个引用之外的所有引用,然后使用最后一个引用删除该项:
obj = l
for index in indices[:-1]:
obj = obj[index]
del obj[indices[-1]]
通过使用除最后一个索引之外的所有索引,您解析了对引用项的父的引用,现在您可以使用最后一个索引将其删除。
答案 1 :(得分:1)
尝试:
del reduce(lambda cur, ind: cur[ind], index_list[:-1], l)[index_list[-1]]
这实际上只是一种更为出色的方式来完成@Martijn Pieters在答案中的建议。