此问题在此处已有答案:
How to remove items from a list while iterating?(25个答案)
昨天关门了。
上下文无关紧要,但是我遇到了一个问题,当我试图从list
中弹出dict
对象时,它不能删除所有的对象。我这样做是为了过滤dict
对象中的某些值,而我留下了一些应该被删除的内容。为了看看会发生什么,我尝试删除list
中名为accepted_auctions
的每个项目(如下所示),但没有成功。
for auction in accepted_auctions:
accepted_auctions.pop(accepted_auctions.index(auction))
print(len(accepted_auctions))
当我测试这段代码时,print(len(accepted_auctions))
将44
输出到控制台。
我做错了什么?
2条答案
按热度按时间yvfmudvl1#
这看起来像是你在使用for循环遍历列表的同时调用了列表上的pop。这通常不是一个好主意,因为for循环使用一个迭代器遍历列表中的项目,而在遍历列表的同时修改列表可能会导致迭代器变得混乱,无法按预期的方式运行。
解决此问题的一种方法是创建一个仅包含要保留的项目的新列表,然后用新列表替换原始列表。下面是一个示例:
另一种解决方法是使用while循环而不是for循环。
我希望这对你有帮助!如果你有任何其他问题,请告诉我。
vc6uscn92#
在迭代列表时修改列表会使迭代器失效(因为在删除项时,所有项的索引都在改变),这反过来会导致它跳过项。
创建过滤列表的最简单方法是通过创建新列表的列表解析,例如:
下面是一个简单的例子,使用列表解析将一个int列表过滤为奇数: