在遍历列表时无意中跳过项

3 投票
5 回答
1886 浏览
提问于 2025-04-16 02:58

我有一个列表,想要把里面不在另一个列表中的东西删掉。我试过下面的代码:

for w in common:
        for i in range(1,n):
            if not w in words[i]:
                common.remove(w)
,但是这样做并没有把所有不需要的东西都删掉。我加了一些打印语句:
for w in common:
        for i in range(1,n):
                        print w
            if not w in words[i]:
                print w
                common.remove(w)
,结果发现有些东西根本没有被打印出来。我在想这是怎么回事?我觉得答案应该很简单,只是我对Python的了解不够,所以现在完全想不出来解决办法。

5 个回答

3

来自Python文档

在循环中修改正在遍历的序列是不安全的(这只会发生在可变序列类型,比如列表)。如果你需要修改正在遍历的列表(比如,想要复制选中的项目),你必须遍历一个副本。

3

你不能直接从正在遍历的列表中删除项目。可以尝试遍历这个列表的一个副本。

for w in common[:]:
    for i in range(1,n):
        if not w in words[i]:
            common.remove(w)
8

我觉得你可以用下面这种方式来简化你的代码:

filtered = filter(lambda x: x in words, common)

这个代码是在检查每个共同的元素是否在“words”这个列表里,如果在的话就把它去掉。根据你想要的结果,你可能需要试试 x not in words,但我觉得这个方法应该差不多能达到你的目的。

我还想补充一个其他的方法,这个方法也可能接近你的需求,不过我需要看看你最初的列表示例才能完全测试它。

filtered = [x for x in common if x in words]

-- 已编辑 -- 我在列表推导式的语法上搞错了,但在看到评论后我发现了这个问题。谢谢!

撰写回答