2015-10-18 62 views
2

我有Python中的代码,我试图从列表中删除编号为1的所有实例。我也知道:为什么不删除()实际上删除Python列表中的重复项的最后一个实例

  1. 在遍历它时不可能改变列表。
  2. remove()删除列表中具有多个实例的项目的第一次出现。
my_list = [2, 3, 1, 5, 8, 4, 6, 1, 1] 
print(my_list) 

for num in my_list: 
    if num == 1: 
     my_list.remove(num) 

print(my_list) 

输出:

[2, 3, 1, 5, 8, 4, 6, 1, 1] 
[2, 3, 5, 8, 4, 6, 1] 

考虑到我提到的两个点,它是如何名单变化?更重要的是,为什么最后一个不会从列表中删除?

+1

“在遍历它时不可能改变列表。”这是可能的,但通常这不是明智的做法。 – Evert

+1

也许你认为你错误地提到了你提到的几点,并从那里拿走它? – juanchopanza

+1

使用列表理解从旧列表中创建一个新列表可能会更清楚,并会删除所有出现的“1”。 – Evert

回答

0

1. 实际上,你可以修改名单,而迭代它:

for i in range(len(my_list)-1, -1, -1): 
    if my_list[i] == 1: 
     del my_list[i] 

这是一个很好的把戏,我前一段时间看到这里的答案在SO之一(我不记得否则我会添加一个链接)。通过向后迭代列表,您可以删除键并仍然可以继续迭代比刚刚删除的索引更低的索引!

  1. 根据文档,remove *应该只删除第一次出现。它正在做它应该做的事!
+0

从示例中可以清楚地看到列表正在被修改。 –

+0

@BurhanKhalid你很清楚,但不是OP,请参阅问题中的第1点。 – alfasin

1

正如评论者所说,实际上对于能够改变列表没有限制。看看这个输出,看看它是否有帮助。

>>> mylist = [1, 2, 3, 1, 2, 3, 1, 2, 3] 
>>> for num in mylist: 
... print(num) 
... if num == 1: 
...  mylist.remove(num) 
... 
1 
3 
1 
3 
1 
3 
>>> print(mylist) 
[2, 3, 2, 3, 2, 3] 

你看到它是如何跳过2s的吗?它正在遍历从索引[0]到索引[-1]的列表。当你调用remove()时,它会跳到下一个索引点。你永远不会删除你的例子中的1,因为for循环已经迭代了那个索引点。