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]

'dog'我可以通过执行访问列表中的元素

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

所以现在l'dog'。但是,我不确定如何从那里将其从列表中删除。我不只是想将其设置为None.

4

2 回答 2

3

您可以遍历除最后一个引用之外的所有引用,然后使用最后一个删除该项目:

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

通过使用除最后一个索引之外的所有索引,您解决了对被引用项的项的引用,因此现在您可以使用最后一个索引将其删除。

于 2012-12-07T17:45:56.603 回答
1

尝试:

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

这实际上只是一种更好的方式来完全按照@Martijn Pieters 在他的回答中提出的建议。

于 2012-12-07T17:47:03.493 回答