Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python (无意中)在迭代列表时跳过项目_Python_List - Fatal编程技术网

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
设置为
集合
,因为检查集合的成员资格比检查列表更快。