Python 减小变量I';m在for循环中递增
我是Python的新手,我已经环顾了一下四周,但没有找到一个满意的答案来回答我的问题。我正在做一些实践问题,我想做一个方法,消除列表中重复的值。到目前为止,这是我的代码:Python 减小变量I';m在for循环中递增,python,list,loops,increment,decrement,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 我希望发生的是,如果有一个副本,弹出其中一个副
def noDouble(nums):
for x in xrange(len(nums) - 2):
if nums[x] == nums[x + 1]:
nums.pop(x)
x -= 1
return nums
我希望发生的是,如果有一个副本,弹出其中一个副本,然后再向后移动(这样,如果有,比如说,相同数量的3个实例,它将通过“倒带”来消除所有副本)
我正在寻找一个解释为什么我的代码不工作以及解释的解决方案,我真的非常感谢任何和所有的帮助。谢谢。据我所知,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
limit=len(nums)-1
x=0
当x
尽管由于您访问列表元素的方式,此代码可能仍然会因索引器而失败。但是,这仍然是添加额外迭代的方式。据我所知,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
limit=len(nums)-1
x=0
当x
尽管由于您访问列表元素的方式,此代码可能仍然会因索引器而失败。但是,这仍然是您添加额外迭代的方式。通常,您永远不希望在循环中操作计数器(除了将其设置为中断循环之外)。出于同样的原因,在砍树时,你不想看到你坐在上面的树枝:-)
与嵌套循环相比,更安全的方法是在一个循环中构建一组操作,然后将此集合传递给第二个循环(每个循环一级深)。通常,您永远不希望在循环中操作计数器(除了将其设置为断开循环)。出于同样的原因,在砍树时,你不想看到你坐在上面的树枝:-)
与嵌套循环相比,更安全的方法是在一个循环中构建一组操作,然后将此集合传递给第二个循环(每个循环有一层深)。因为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))
。但这将删除所有重复项,而不仅仅是相邻项,并且可能也会破坏项目订单。因为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))
。但这将删除所有重复项,而不仅仅是相邻项,并且可能也会破坏项目顺序。请注意,set
将给出与OP的代码不同的行为。他的方法(如果可行的话)是只将每个元素与下一个元素进行比较,因此它只会折叠连续的重复序列,但set
将删除所有重复序列。不过,这里不清楚实际需要什么行为。continue
跳到循环的下一次运行item==new[-1]
检查item
是否等于new
列表中的最后一项。@Eevee,为什么需要new
?为什么该和语句的第一部分是空的?因为如果new
是空的,那么就没有最后一项可以比较了。可能值得注意的是<代码>[val for val,group in groupby(nums)]
构建一个新列表,将任何重复组折叠到元素的单个引用中。请注意,set
将给出不同于OP代码的行为。他的方法(如果可行的话)是只将每个元素与下一个元素进行比较,因此它只会折叠连续的重复序列,但set
将删除所有重复序列。不过,这里不清楚实际需要什么行为。continue
跳到循环的下一次运行item==new[-1]
检查item
是否等于new
列表中的最后一项。@Eevee,为什么需要new
?为什么该和语句的第一部分是空的?因为如果new
是空的,则没有最后一项可以比较。可能值得注意的是