列表索引超出范围错误

时间:2015-04-01 07:29:12

标签: python bioinformatics

所以我再次在python中得到一个超出范围错误的列表索引,我无法弄清楚错误是什么。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

f1 = open("membrane_GO.txt","r")
new_list1 = f1.readlines()
new_list2 = new_list1
for i in range(len(new_list1)):
    if "Reactome" in new_list1[i]:
        new_list2.pop(i)
print new_list2  
f1.close()

我确保在重复列出主列表时修改了重复列表,因此无法解决问题。

感谢任何帮助 谢谢:)

4 个答案:

答案 0 :(得分:2)

您只复制了对列表的引用。如果要创建列表的单独副本,请使用切片:list2 = list1[:]或查看deepcopy模块。

答案 1 :(得分:2)

弹出时,阵列大小会下降。这意味着如果列表长度为10,而你pop(0),那么列表的长度为9.如果你然后pop(9),它不存在,它会给你一个越界错误。

示例:

>>> x = [0,1,2,3,4]
>>> print x, len(x)
[0,1,2,3,4], 5
>>> x.pop(0)
>>> print x, len(x)
[1,2,3,4], 4

这是你的错误,因为你从0到len(new_list1)。

我建议你采取的方法是创建一个新的列表,其中" Reactome"不在new_list1 [i]。

您可以在列表理解中轻松完成此操作。

with open("membrane_GO.txt","r") as f:
    lines = [line for line in f.readlines() if "Reactome" not in line]
print lines

答案 2 :(得分:1)

假设您的列表最初是['a','b','c'],

然后list1 = list2 = ['a', 'b', 'c']

然后你执行len(list2)的迭代,即3次, 然后i将取值0,1和2.

在每次迭代中,您要从list1中删除一个元素。

i = 0
remove list1[0]
new list = ['b', 'c']

i = 1
remove list1[1]
new list = ['b']

i = 2
remove list[2] which does not exist.

所以你会得到index out of bound error

答案 3 :(得分:0)

只需添加TigerHawks答案:

由于您只复制了引用(而不是列表本身),当您pop() new_list2之后的某个元素时,您也会将其从new_list1中删除,因为它们是“{1}}两个都引用相同的列表。

说有' n'循环开始时new_list1 中的元素。它将适用于' n'迭代。

假设你在new_list2中弹出一个元素(以及new_list1以外的元素),在循环中,当循环尝试时会出现index out of range错误访问第'列表的元素,现在只有' n-1'其中的元素

为了使其正常工作,请使用切片复制列表:

new_list2 = new_list1[:]

顺便说一下,我认为for i in range(len(new_list1)):被认为是非pythonic。 A'更好'方法是使用enumerate

for index, element in enumerate(new_list1):
    if "Reactome" in element:
        new_list2.pop(index)