我有一个列表,我想从中删除未出现在另一个列表中的项目。我尝试过以下方法:
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知识,但我完全没有想法。
答案 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)
修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表)。如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本。
答案 3 :(得分:2)
您正在尝试迭代列表时修改列表。 您可以修改代码的第一行以遍历列表的副本(使用common [:])。
答案 4 :(得分:1)
如果删除(比方说)第5项,那么旧项目6现在将成为第5项。因此,如果您想要转到第6项,您将跳过它。
是否有可能在该列表上向后迭代?然后索引更改发生在您已处理的部分中。