我有一个小问题:我有两个相同长度的列表。
正如您在我的代码中看到的那样,如果发生了适当的情况,我会从列表中删除一些元素。我必须非常小心地完成我的工作所以我的问题是 - 如果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()
答案 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)
以下是对您的问题的直接回答,您不应该在同一列表上进行迭代时删除列表中的项目,它会产生意外的结果,因为某些项目将被跳过。为了避免这种情况,您可以在迭代中使用相同列表的副本。