Python (无意中)在迭代列表时跳过项目
我有一个列表,我想从中删除其他列表中没有的项目。我尝试了以下方法:Python (无意中)在迭代列表时跳过项目,python,list,Python,List,我有一个列表,我想从中删除其他列表中没有的项目。我尝试了以下方法: for w in common: for i in range(1,n): if not w in words[i]: common.remove(w) 但是,这无法删除某些项目。添加print语句会导致某些w永远无法打印。你知道发生了什么事吗?我假设答案很简单,我只是没有足够的Python知识,但我完全没有想法。您不能从正在迭代的列表中删除项目。尝试在列表
for w in common:
for i in range(1,n):
if not w in words[i]:
common.remove(w)
但是,这无法删除某些项目。添加print语句会导致某些w永远无法打印。你知道发生了什么事吗?我假设答案很简单,我只是没有足够的Python知识,但我完全没有想法。您不能从正在迭代的列表中删除项目。尝试在列表的副本上迭代
for w in common:
for i in range(1,n):
print w
if not w in words[i]:
print w
common.remove(w)
for w in common[:]:
for i in range(1,n):
if not w in words[i]:
common.remove(w)
您正在修改列表,同时尝试对其进行迭代。
您可以修改代码的第一行以遍历列表的副本(使用common[:])。我认为您可以使用以下内容简化您的语句:
filtered = filter(lambda x: x in words, common)
这就是检查每个元素是否存在于单词中,并基于它删除。你可能需要尝试x而不是用词这取决于你想要的结果,但我认为这应该很接近
我想添加另一种方法,这种方法可能也很接近,不过我需要查看您的初始列表的示例来全面测试它
filtered = [x for x in common if x in words]
--已编辑--我在列表中的语法是反向的,但在看到注释后捕获了它。谢谢 来自:
在循环中修改正在迭代的序列是不安全的(这只能发生在可变序列类型,如列表)。如果需要修改正在迭代的列表(例如,复制选定项),则必须迭代副本
如果您删除(比如)第5项,那么旧的第6项现在将成为第5项。因此,如果你想转到第6项,你将跳过它
是否可以在该列表上反向迭代?然后索引更改会发生在您已经处理的部分中。很好,但我更喜欢过滤=[x代表x,如果x在words中]
或过滤=过滤(words.\uu包含\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。可能是第一个。它越来越像蟒蛇了;)谢谢你,穆罕默德。我第二个想到的是名单。感谢您的反馈。:)为了提高效率,您应该将common
设置为集合
,因为检查集合的成员资格比检查列表更快。