在遍历列表时无意中跳过项
我有一个列表,想要把里面不在另一个列表中的东西删掉。我试过下面的代码:
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]
-- 已编辑 -- 我在列表推导式的语法上搞错了,但在看到评论后我发现了这个问题。谢谢!