所以我再次在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()
我确保在重复列出主列表时修改了重复列表,因此无法解决问题。
感谢任何帮助 谢谢:)
答案 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)