<p>你的代码有几个问题。你知道吗</p>
<p>正如AbhiP所指出的,您正在查看列表中的连续项对-您应该比较<code>len(nums)-1</code>对,但您正在尝试比较<code>len(nums)</code>对。这是索引错误的一个原因。你知道吗</p>
<p>第二,正如John提到的,在循环浏览列表时,您正在删除列表中的项目。如果确实要保留当前结构,则需要在删除项时增加循环变量。你知道吗</p>
<p><strong>更正/澄清</strong>:第二点不会导致索引错误,但会使代码跳过某些对的求值,例如对于<code>[1, 1, 1, 2]</code>等输入,从而导致错误。你知道吗</p>
<p>考虑到这两点,您的代码将如下所示:</p>
<pre><code>i = 0
while i < len(nums) - 1:
if nums[i] == nums[i+1]:
nums.remove(nums[i])
else:
i += 1
</code></pre>
<p>这将删除索引错误。你知道吗</p>
<p>第三,<code>nums.remove(nums[i])</code>也会导致非索引错误。用<code>nums</code>作为<code>[1, 2, 3, 1, 1]</code>来尝试上面的代码。您将看到第一个<code>1</code>被删除,而不是列表中的第四个或第五个项目。这是因为列表上的<code>remove</code>除去了列表中出现的第一个实例。您可能应该改为<code>del</code>,如下所示:</p>
<pre><code>i = 0
while i < len(nums) - 1:
if nums[i] == nums[i+1]:
del nums[i]
else:
i += 1
</code></pre>
<p>最后,虽然不是一个bug,但最佳实践建议您不应该在循环遍历列表时修改它—这使得代码很难推理,并且可能导致微妙的bug。相反,如果你只是创建一个新的列表并返回它通常会更好。你知道吗</p>
<pre><code>new_nums = []
for i in range(len(new_nums)-1):
if nums[i] != nums[i+1]:
new_nums.append(nums[i])
new_nums.append(nums[-1])
</code></pre>
<p>另一种编写方法是使用<code>zip</code>和列表理解,这是Python的两个很酷的特性:</p>
<pre><code>new_nums = [item1 for item1, item2 in zip(nums, nums[1:]) if item1 != item2]
new_nums.append(nums[-1])
</code></pre>