元素未从Python 3中的列表中删除

元素未从Python 3中的列表中删除,python,python-3.x,list,element,Python,Python 3.x,List,Element,输出>>[3,4] 数字3不应该在列表中,因为它通过了i,这是因为您在遍历列表时正在从列表中删除元素。可以这样解决 d = 3 cl = [1,3,4] for i in cl: if i <= d: cl.remove(i) print(cl) 这很有效 [num for num in cl if num > d] 请接受它是否有效…这是在迭代过程中改变数据结构的结果。for循环实质上是在列表上创建一个迭代器,每个项都调用nextiterator。但是

输出>>[3,4]


数字3不应该在列表中,因为它通过了i,这是因为您在遍历列表时正在从列表中删除元素。可以这样解决

d = 3
cl = [1,3,4]

for i in cl:
    if i <= d:
        cl.remove(i)
print(cl)
这很有效

[num for num in cl if num > d]

请接受它是否有效…

这是在迭代过程中改变数据结构的结果。for循环实质上是在列表上创建一个迭代器,每个项都调用nextiterator。但是,弹出项会更改迭代器所查看的内容

a=[1,2,3,4] it=itera 第一次迭代 下一个 1. 删除元素 a、 pop0 1. 我们跳过了2个! 下一个 3. 为什么??我们通过删除当前所在的元素,有效地改变了迭代器指向的元素。我们在看序列中的第一个元素,但是它被删除了,所以现在第二个元素是第一个。因此,对next的调用指向以下元素。这看起来像是被跳过了,而实际上不是,只是无意中让元素向前移动了

为了避免这种情况,最好通过过滤创建一个新的列表,正如@AlexanderLekontsev在他的回答中所建议的那样。这样可以避免在迭代时发生变异。您可以使用带有append的标准循环执行此操作,如下所示:

新列表=[] 对于cl中的num: 如果num>=d: newlist.appendnum
本质上,由于您在遍历列表时正在从列表中删除元素,因此跳过了值3

在for循环的第一次迭代中,删除值1。由于Python中迭代的工作方式,在for循环的第二次迭代中,您正在寻找nextnextcl。但是,cl已更新为[3,4],因为您删除了1。现在nextnextcl=next3=4,跳过了3


您可以通过创建一个新列表并在执行过程中进行更新来解决此问题。使用列表理解实现这一点的一个简单方法是[num for num in cl if num>d]。

不要迭代从列表中删除的列表,因为循环中更新了对迭代器的引用,它不是保持在下一个下一个吗?
d = 3
cl = [1, 3, 4]
for i in range(len(cl)):
    if cl[i-1] <= d:
        cl.remove(cl[i-1])
print(cl)