Arbitrarily嵌套列表中的del运算符

时间:2012-12-07 17:44:28

标签: python

我正在使用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}}。

2 个答案:

答案 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在答案中的建议。