错误:索引超出范围

时间:2016-11-23 14:41:54

标签: python indexing error-handling

x=int(input("limit"))
n=[]
for i in range (x):
 k=input("number to add")
 n.append(k)
print "to pop the multiples of five"
print n
for no in n:
 if (no%5==0):
  n.pop(no)

print n

我的流行指数超出范围,但据我检查那里没有错误..请帮助我,快速

2 个答案:

答案 0 :(得分:0)

<强> Explaintion

You are using pop() wrong. pop(x)接受一个参数并弹出或删除该索引,而不是项目。因此,当您pop(5)未从列表中弹出5时,您将弹出索引5。这就是为什么你得到索引超出范围的错误。试试这个(请注意,这仍然是错误的,但这是为了教导pop的功能):

x = [1,2,3,4,9,10,10,10]
for i,no in enumerate(x):
 if (no%5==0):
  x.pop(i)

print(x) #prints out : [1, 2, 3, 4, 9, 10]

enumerate()基本上采用列表或字典或元组,并返回索引和该索引中的项。例如:

x = [1,2,3,4,9]
for index, item in enumerate(x):
  print("index {}, item {}".format(index,item))

打印出来:

index 0, item 1
index 1, item 2
index 2, item 3
index 3, item 4
index 4, item 9

使用enumerate()我们可以获取索引并仍然测试该值并使用它来改变它,例如pop()。现在,在我们通过它时更改列表是个坏主意。为什么呢?

在迭代它时(循环遍历它)修改容器(在这种情况下为pop() list)的问题是你可能会删除值。这是一个例子:

alist = [5, 6, 7]
for index, value in enumerate(alist):
    del alist[index]
print(alist)
# Out: [6] 

为什么循环后它只包含[6]而不是空列表?好吧,第一次迭代它删除了第一个项目,即索引0中的5。这很好,但现在列表是[6,7]6在索引槽0中。当下一个循环时发生时,7位于索引槽1中,因为每次将列表的大小减少一个。因此我们跳过了插槽0中的值6。在第二个循环之后,我们完成了for循环,因为没有任何东西可以循环。

<强>解决方案

n = [1,2,3,4,9,10,10,10]
new_list = []
for no in n:
 if (no%5!=0):
  new_list.append(no)

print n # gives [1, 2, 3, 4, 9]

制作一个新列表,并根据您的条件为该列表添加值,因为您想删除x % 5 == 0项,如果它不等于零,我们可以添加项。

如果你想要更多“Pythonic”或花哨或一个衬垫,你可以做:

x = [1,2,3,4,9,10,10,10]
new_list = [a for a in x if a % 5 != 0]
print(new_list)

它被称为list comprehension。在Python中非常有用。

答案 1 :(得分:0)

格雷厄姆说你正在以错误的方式使用列表。下面的代码可以给你更好的想法。

x=int(input("limit"))
n=[]
for i in range (x):
 k=input("number to add")
 n.append(k)
print "to pop the multiples of five"
print n
for no in n:
 if (no%5==0):
   n.pop(n.index(no)) # remove index of element you want to remove
print n