Python:列出循环删除故障的索引

时间:2015-08-17 19:31:03

标签: python list for-loop indexing del

这是一个非常棘手的问题需要解释。我正在玩Python的列表方法,特别是del索引对象。我想创建一个简单的脚本,它将创建一个从1到100的整数列表,然后是一个for循环,它将从列表中删除奇数。

这是我写的脚本:

def main():
    num = list(range(1,101))
    print(num)
    for i in range(0,101):
        del num[i]
    print(num)
main()

好像它会起作用吗?我也这么认为,直到我跑了。

我不确定原因,但当i传递给del num[i]索引时,数字本身翻了一番。

当我跑步时,我收到了IndexError: list assignment index out of range

当我将参数从range(0,101)更改为range(0,10)时,我发现它删除了从1到20的所有奇数。

换句话说,索引中的i在不应该加倍时加倍。我能获得一些有关此事的信息吗?

5 个答案:

答案 0 :(得分:6)

删除项目时,列表的大小会减少。在大约50次循环迭代之后,列表中有大约50个项目,因此嵌套迭代会尝试删除列表外的内容。

这是一个模拟运行:

>>> a = [1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4, 5]
>>> del a[0]
>>> a
[2, 3, 4, 5]
>>> del a[1]
>>> a
[2, 4, 5]
>>> del a[2]
>>> a
[2, 4]
>>> del a[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

答案 1 :(得分:0)

您的迭代范围从0到101,并在每次迭代时从 num 中删除一个项目,因此num的长度正在减少,您最终得到 IndexError

答案 2 :(得分:0)

当您在for循环中使用export HISTFILESIZE=100000 关键字时,它会从您创建的原始del列表中完全删除该项目。通过这样做,列表的长度随着循环的每次迭代而变得越来越小。

这也解释了为什么它只删除奇数,因为索引在每次删除后都会向下移动,从而允许偶数数字滑过程序的裂缝:

num

要删除奇数,请考虑使用条件来检查num = range(1, 5) # num = [1, 2, 3, 4] del num[0] # results in num = [2, 3, 4] del num [1] # deletes 3, and num now = [2, 4] etc. for a longer loop 状态和%2 == 0方法:

list.remove()

或者main()函数中的列表理解:

num = range(1, 101)
for i in num:
    if i % 2 != 0:
        num.remove(i)
print(num)

答案 3 :(得分:0)

此问题与mutatinglist非常相似,同时在同一列表中进行迭代,请查看以下链接,以帮助您更好地了解这种情况。

http://gsb-eng.com/why-python-list-mutation-is-not-a-good-idea/

答案 4 :(得分:0)

对于第二个 for 循环,您应该使用总索引的一半,因为在第 50 次迭代时,将删除 50 个元素,因此列表的总索引减少到 50 ,因此在第 51 次迭代时,它显示超出范围的错误。