在循环中递减我正在递增的变量

0 投票
3 回答
2926 浏览
提问于 2025-04-18 14:00

我对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个相同的数字,就能通过“回退”把它们全部去掉)。

我希望能得到一个解释,告诉我为什么我的代码不管用,还有一个详细的解决方案。如果能帮忙,我会非常感激。谢谢!

3 个回答

0

一般来说,你在循环中不应该随便改变计数器的值(除了在需要退出循环时可以设置一下)。就像你在砍树的时候,不想在自己坐的树枝上锯一样,安全第一 :-)

相比于嵌套循环,更安全的做法是先在一个循环中准备好一系列操作,然后把这些操作传递给第二个循环(每个循环只嵌套一层)。

2

根据我的理解,for 循环在 Python 中并不像 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 错误。但这就是你可以增加额外循环次数的方法。

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))。不过这样会去掉所有的重复项,而不仅仅是相邻的那些,而且可能还会打乱原来的顺序。

撰写回答