def noDouble(nums):
for x in xrange(len(nums) - 2):
if nums[x] == nums[x + 1]:
nums.pop(x)
x -= 1
return nums
我想要发生的事情是,如果有重复,请弹出其中一个重复项,然后再移回(如果有3个相同数字的实例,那么它就会出现'#l; ll通过'倒带来消除它们。
我正在寻找解释为什么我的代码不能正常工作以及解释的解决方案,我非常感谢任何和所有的帮助。感谢。
答案 0 :(得分:3)
因为for
不计算数字;它迭代一个序列。每次循环体执行时,x
都会设置为xrange
生成的下一个值。 for
语句无法关注循环结束时x
的内容。
无论如何,你真的不应该修改循环中的列表。更简单的方法是建立一个新列表:
def remove_doubles(old):
new = []
for item in old:
if new and item == new[-1]:
continue
new.append(item)
return new
当然,真正删除重复项的简单方法是list(set(foo))
。但是这将删除所有重复项,而不仅仅是相邻项,并且可能也会破坏项目顺序。
答案 1 :(得分:0)
据我了解,for
循环不是像C或Java那样简单的增量; Python实际上会强制x
回到它预期的下一个循环迭代的值。因此,递减x
将不会产生添加更多循环迭代的效果,因为它将被强制重置。
for x in range(10):
x -= 1
print x
将产生
-1
0
1
2
3
4
5
6
7
8
编辑:这是您尝试做的事情的可能性,尽管您的具体用例更容易接受答案。使用while
代替for
:
limit = len(nums) - 1
x = 0
while x < limit:
if nums[x] == nums[x+1]:
nums.pop(x)
x -= 1
x += 1
return nums
尽管由于您访问列表元素的方式,此代码仍可能因IndexError
而失败。但是,这仍然是你添加额外迭代的方式。
答案 2 :(得分:0)
通常,您永远不想在循环中操作计数器(除了将其设置为突破循环)。出于类似的原因,当你砍伐一棵树时,你不希望看到你所坐的树枝: - )
更安全的路由(与嵌套循环相比)是在一个循环中构建一组操作,然后将此集传递给第二个循环(每个循环深一个级别)。