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

2024-10-01 07:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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个相同数量的实例,它将通过“倒带”来删除所有这些实例)。在

我正在寻找一个解释为什么我的代码不能像一个解释的解决方案,我真的非常感谢任何和所有的帮助。谢谢。在


Tags: 实例方法答案代码in列表forlen
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{I>循环中的{I}与下一个循环中的循环}不一样,它实际上是一个循环。因此,减少x不会产生添加更多循环迭代的效果,因为它将被强制重置。在

for x in range(10):
x -= 1
print x

会屈服的

^{pr2}$

编辑:这里有一个你正在尝试做的事情的可能性,尽管接受的答案对于你的特定用例来说更容易。使用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。但是,这仍然是添加额外迭代的方式。在

相关问题 更多 >