在循环中递减我正在递增的变量
我对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 个回答
一般来说,你在循环中不应该随便改变计数器的值(除了在需要退出循环时可以设置一下)。就像你在砍树的时候,不想在自己坐的树枝上锯一样,安全第一 :-)
相比于嵌套循环,更安全的做法是先在一个循环中准备好一系列操作,然后把这些操作传递给第二个循环(每个循环只嵌套一层)。
根据我的理解,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
错误。但这就是你可以增加额外循环次数的方法。
因为 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))
。不过这样会去掉所有的重复项,而不仅仅是相邻的那些,而且可能还会打乱原来的顺序。