在Python中递归删除树中的项目

2 投票
2 回答
519 浏览
提问于 2025-04-18 05:42
seen2 = set()

def eliminate_abs(d): ##remove all entries that connect to the abstraction node, type(d) = list
    def rec(x):
        if x not in seen2:
            seen2.add(x)
            a = x.hypernyms()
            if len(a) != 0:
                kk = a[0]
                if re.search('abstraction',str(kk)):
                    syns.remove(ii)
                else:
                    rec(kk)

    for ii in d: ##type(ii) = <class 'nltk.corpus.reader.wordnet.Synset'>
        rec(ii)

eliminate_abs(syns)

这个“syns”列表最后会变成一棵树,但我首先需要把所有最终连接到“abstraction”这个节点的项去掉。我希望这个函数能递归地检查“syns”中每个项的所有上位词,如果找到“abstraction”,就把原来的词从“syns”中删除。但不知为什么,这个函数只删除了一部分项。

2 个回答

0

我搞明白了。这个代码运行得很好,但在处理的过程中有很多重复的项,所以在第一个之后的那些都被跳过了。把这段代码去掉:
if not x in seen2:
seen2.add(x)
这样就能正常工作了。

2

因为你在遍历 syns 的时候还在修改它,所以你应该先复制一份 syns 的内容,然后再遍历这份复制的列表:

for ii in d[:]:
    rec(ii)

撰写回答