减少变量我在for循环中递增

时间:2014-07-20 04:24:04

标签: python list loops increment decrement

有点像Python的新手,我已经看了一下但是我找不到满意的答案。我正在做一些练习问题,我想制作一个方法来摆脱列表中的重复值。到目前为止,这是我的代码:

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通过'倒带来消除它们。

我正在寻找解释为什么我的代码不能正常工作以及解释的解决方案,我非常感谢任何和所有的帮助。感谢。

3 个答案:

答案 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)

通常,您永远不想在循环中操作计数器(除了将其设置为突破循环)。出于类似的原因,当你砍伐一棵树时,你不希望看到你所坐的树枝: - )

更安全的路由(与嵌套循环相比)是在一个循环中构建一组操作,然后将此集传递给第二个循环(每个循环深一个级别)。