当您从正在迭代的列表中删除项时,问题就出现了。迭代的工作原理是这样的:列表中的每个索引从头到尾都被访问一次。删除某些内容时,列表的内容将向左移动:| 1 | 2 | 3 | 4 | 5 | << your list
| 1 | 2 | | 4 | 5 | << 3 is deleted
| 1 | 2 | 4 | 5 | << the list fills in the gap
但是,迭代器的索引不知道列表的其余部分已经向左改变了一个索引,所以它继续前进。在
通常,列表是这样迭代的:
^{pr2}$
但是,当您删除术语时,会发生以下情况:| 1 | 2 | 3 | 4 | 5 |
^ index
| 1 | 2 | 4 | 5 |
^ Oops! The iterator skips over the missing 3, and never gets to it.
您可以通过手动迭代索引来修复此问题,仅在删除而不是时前进:def remove_adjacent(nums):
previous = ''
i = 0;
while i < len(nums):
if nums[i] == previous:
nums.remove(i)
else:
previous = nums[i]
i+=1
return nums
这避免了使用[:]制作列表的软拷贝(尽管这是另一种方法)
希望这有帮助!在