Python 具有变化范围的For循环

Python 具有变化范围的For循环,python,loops,Python,Loops,我有一个小问题:我有两个长度相等的列表 正如您在下面的代码中看到的,如果发生适当的情况,我将从列表中删除一些元素。我必须非常仔细地做我的工作,所以我的问题是-如果len(整代)正在改变,for循环是否会在每次迭代中检查??它不会跳过一些项目吗 whole_st_gen = [] whole_end_gen = [] // the length of both of them is 38273 if_merge = 0 here_merge = 0 deleting = False for x

我有一个小问题:我有两个长度相等的列表

正如您在下面的代码中看到的,如果发生适当的情况,我将从列表中删除一些元素。我必须非常仔细地做我的工作,所以我的问题是-如果len(整代)正在改变,for循环是否会在每次迭代中检查??它不会跳过一些项目吗

whole_st_gen = []
whole_end_gen = [] // the length of both of them is 38273
if_merge = 0
here_merge = 0
deleting = False

for x in range (0, len(whole_st_gen)):
    if_merge = x
    if x == len(whole_st_gen)-1:
        break
    for y in range (x+1, len(whole_st_gen)):
        if whole_end_gen[x]>whole_end_gen[y]:
            deleting = True
            here_merge = y
            continue
        else:
            break
    if deleting == True:
        deleting = False
        del whole_st_gen[x:here_merge]
        del whole_end_gen[x:here_merge]
    if_merge = 0
    here_merge = 0

print len(whole_st_gen) # here's length is 1852, so i think it could work properly, just want to be sure!
sys.exit()

下面是对您的问题的直接回答,您不应该在重复相同列表时删除列表中的项目,这会产生意外的结果,因为某些项目将被跳过。为了避免这种情况,您可以在迭代中使用相同列表的副本。

否,当您使用
range()
方法时,它不会在每次迭代中检查数组的长度。尤其是在Python2.x中,
range()
返回一个列表,这是您迭代的内容,该列表是在循环开始时创建的,不会在每次迭代中重新计算。因此,使用上述方法时可能会遇到多个问题

一个是可以跳过某些元素,因为如果从列表中删除元素,列表的索引将重新排列以形成连续序列,因此最终会缺少一些元素

其次,您可以得到getitng
indexer
,这是一个简单的例子-

>>> l = [1,2,3,4]
>>> for i in range(0,len(l)):
...     del l[i]
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list assignment index out of range
正如在评论中所说的,一种更简单的方法是使用
while
循环,它在删除项目时不会增加。范例-

if_merge = 0
here_merge = 0
deleting = False
x = 0
while x < len(whole_st_gen):
    for y in range (x+1, len(whole_st_gen)):
        if whole_end_gen[x]>whole_end_gen[y]:
            deleting = True
            here_merge = y
        else:
            break
    if deleting == True:
        deleting = False
        del whole_st_gen[x:here_merge]
        del whole_end_gen[x:here_merge]
    else:
        x += 1
    here_merge = 0

print len(whole_st_gen)
sys.exit()
如果_merge=0
这里_merge=0
删除=假
x=0
而x整根[y]:
删除=真
这里_merge=y
其他:
打破
如果deleting==True:
删除=假
整个圣根[x:这里合并]
删除整个\u结束\u根[x:此处\u合并]
其他:
x+=1
这里_merge=0
打印透镜(整根)
sys.exit()

for
语句中,首先计算表达式列表(在
中的
之后)以获得迭代器(或iterable),然后用于迭代,表达式列表在每次迭代中不会再次计算

在本例中,调用
range
函数来检索迭代器(在python3中)或iterable(在python2中以列表的形式)。在这两种情况下,迭代器/iterable都将产生
len(整代)
(当您从上面到达
for
语句时,它将进行计算)数字(从零开始)。如果您更改循环中的
整列
,它将不会影响迭代器,并且它将生成相同的数字(导致您跳过数字,最终得到超出
整列
索引的数字)


与遍历容器本身的情况相反,完全指定了执行此操作时的行为。如果小心,可以删除并插入容器中的元素。

只需使用while循环:
i=0
<代码>而我
;如果某个元素被删除,则不要递增
i
,否则请递增
i
。您的代码需要进行一些清理。给我一分钟..不,for循环无法识别列表已被修改。看看这里的答案:@SuperBiasedMan,当然相关,但也有一个隐含的问题,“我如何使这项工作?”@themember,代码应该做什么?你知道你当前的代码是否有效吗?虽然你的观点是正确的,但这作为一个注释比作为一个答案更有意义。这并不能提供问题的答案。若要评论或要求作者澄清,请在他们的帖子下方留下评论-你可以随时在自己的帖子上发表评论,一旦你有足够的评论,你就可以发表评论。@bitoiu,你读过这个问题吗?我相信这回答了他的问题,可能需要更多的解释though@pydev,我猜第一条评论的3票以上证实了我的评论。@bitoiu,第一条评论没有说“这没有提供问题的答案”。上面写着“这作为一个评论比作为一个回答更有意义”非常感谢,我会马上检查一下这段代码看起来更好,但我以前的for版本给出了相同的结果:)是的,但是for循环可能会遗漏一些元素,就像我在上面的解释中所说的,第一点
if_merge = 0
here_merge = 0
deleting = False
x = 0
while x < len(whole_st_gen):
    for y in range (x+1, len(whole_st_gen)):
        if whole_end_gen[x]>whole_end_gen[y]:
            deleting = True
            here_merge = y
        else:
            break
    if deleting == True:
        deleting = False
        del whole_st_gen[x:here_merge]
        del whole_end_gen[x:here_merge]
    else:
        x += 1
    here_merge = 0

print len(whole_st_gen)
sys.exit()