Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 减小变量I';m在for循环中递增_Python_List_Loops_Increment_Decrement - Fatal编程技术网

Python 减小变量I';m在for循环中递增

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 我希望发生的是,如果有一个副本,弹出其中一个副

我是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个实例,它将通过“倒带”来消除所有副本)


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

据我所知,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
是空的,则没有最后一项可以比较。可能值得注意的是