如何删除列表中除1以外的所有数字(Python)



我希望我的代码删除列表中的每个数字,除了一个特定的数字,即3。相反,它删除了某些数字,但其中大多数仍然保留在列表中。

myList = [0,1,2,3,4,5]
i = 0
for i in myList:
print(i)
if i != 3:
myList.remove(i)
else:
continue
i += 1
print(myList)

您遇到了一些问题。首先,当你试图处理列表时,你正在尝试修改列表。你可以通过更改来解决这个问题:

for i in myList:

至:

for i in myList[:]:

这将允许您的代码给出所需的结果。它使一个";复制";的列表,这样您就可以在不打乱迭代循环的情况下修改原始列表。

另一件需要注意的事情是,在for循环中为i分配一个值,但在if-else块之后手动更改它。当您返回到循环的顶部时,该更改将被丢弃。

此外,您是else: continue阻止递增i,但这并不重要,因为递增的值无论如何都会被丢弃。

所以。。。评论掉一些不必要的东西给出:

myList = [0,1,2,3,4,5]
# i = 0
for i in myList[:]:
print(i)
if i != 3:
myList.remove(i)
# else:
# continue
# i += 1
print(myList)

您有几个问题。首先,for循环迭代列表值,而不是其索引。您可以使用enumerate来获取索引和值。其次,如果删除列表中的值,则列表中的其余元素将下移1,但由于迭代器也递增1,因此会丢失一个值。一个技巧是反向迭代列表,使任何删除的值都已经迭代。

>>> myList = [0,1,2,3,4,5]
>>> mlen = len(myList)
>>> for i, v in enumerate(reversed(myList), 1):
...     if v != 3:
...         del myList[mlen-i]
... 
>>> 
>>> myList

但是这个操作很慢。如果您不需要修改原始列表,请使用列表理解

>>> myList = [0,1,2,3,4,5]
>>> myList = [v for v in myList if v==3]
>>> myList
[3]

问题是您正在从正在迭代的列表中删除元素。因此,您的循环不会遍历整个列表。

最新更新