(无意中)迭代列表时跳过项目

时间:2010-08-18 15:06:33

标签: python list

我有一个列表,我想从中删除未出现在另一个列表中的项目。我尝试过以下方法:     

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 个答案:

答案 0 :(得分:8)

我认为您可以使用以下内容简化您的陈述:

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

这是检查每个元素的共同点,因为它存在于单词中并基于它进行删除。您可能需要尝试x not in words,具体取决于您所期望的结果,但我认为应该接近。

我想添加另一种方法,可能也会接近,但我需要查看初始列表的示例以便对其进行全面测试。

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

- 已编辑 - 我在列表理解中向后调整了语法,但在看到评论后就抓住了它。谢谢!

答案 1 :(得分:3)

您无法从正在迭代的列表中删除项目。尝试迭代列表的副本。

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

答案 2 :(得分:3)

来自the Python docs

  

修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表)。如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本。

答案 3 :(得分:2)

您正在尝试迭代列表时修改列表。 您可以修改代码的第一行以遍历列表的副本(使用common [:])。

答案 4 :(得分:1)

如果删除(比方说)第5项,那么旧项目6现在将成为第5项。因此,如果您想要转到第6项,您将跳过它。

是否有可能在该列表上向后迭代?然后索引更改发生在您已处理的部分中。