用于具有变化范围的循环

时间:2015-08-11 10:01:47

标签: python loops

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

正如您在我的代码中看到的那样,如果发生了适当的情况,我会从列表中删除一些元素。我必须非常小心地完成我的工作所以我的问题是 - 如果len(whole_st_gen)正在改变,那么每次迭代都会进行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()

3 个答案:

答案 0 :(得分:1)

不,当您使用[[object Object] { id: 1, location: [object Object] { id: 1, name: "location 1" }, location_id: 1, title: "issue 1" }, [object Object] { id: 12, location: [object Object] { id: 2, name: "location 2" }, location_id: 2, title: "issue 1" }] 方法时,它不会在每次迭代中检查数组的长度。特别是在Python 2.x中,range()返回一个列表,这是你迭代的,这个列表是在循环开始时创建的,它不会在每次迭代中重新计算。因此,使用上述方法时可能会遇到多个问题。

一个是你可以跳过一些元素,因为如果从列表中删除一个元素,列表的索引会被重新排列以形成一个连续的序列,所以你最终会遗漏一些元素。

其次,你最终可以获得range(),简单的例子 -

IndexError

这是因为就像我在起始范围()中所说的那样,在开始时计算完整范围(甚至是Python 2.x中的>>> 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 )。由于 -

,这不会发生在你身上
xrange()

与评论中所说的一样,更简单的方法是使用if x == len(whole_st_gen)-1: break 循环,在删除项目时不会增加。示例 -

while

答案 1 :(得分:0)

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

在你的情况下,你调用range函数来检索迭代器(在python3中)或迭代(在python2中以列表的形式)。在这两种情况下,迭代器/可迭代将产生len(whole_st_gen)(当它从上面到达for语句时进行评估)数字(范围从零)。如果你改变循环中的whole_st_len它将不会影响迭代器,它将产生相同的数字(导致你跳过数字,并最终获得超出whole_st_gen索引的数字)。

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

答案 2 :(得分:-1)

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