首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:索引超出范围

错误:索引超出范围
EN

Stack Overflow用户
提问于 2016-11-23 22:41:54
回答 2查看 50关注 0票数 0
代码语言:javascript
复制
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

我的pop索引超出了范围,但据我所知,没有错误..请帮帮我,快点

EN

回答 2

Stack Overflow用户

发布于 2016-11-23 23:25:00

解释

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

代码语言:javascript
复制
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()基本上接受一个列表、字典或元组,并返回索引和索引中的项。示例:

代码语言:javascript
复制
x = [1,2,3,4,9]
for index, item in enumerate(x):
  print("index {}, item {}".format(index,item))

打印输出:

代码语言:javascript
复制
index 0, item 1
index 1, item 2
index 2, item 3
index 3, item 4
index 4, item 9

使用enumerate(),我们可以获得索引,但仍然可以测试值,并使用它进行更改,例如pop()-ing it。现在,在我们浏览列表时更改列表是一个坏主意。为什么?

在遍历容器(循环遍历)时修改容器(在本例中是pop()ing a list)的问题是可能会丢弃值。下面是一个例子:

代码语言:javascript
复制
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循环,因为没有什么可循环的了。

解决方案

代码语言:javascript
复制
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“或花哨的东西,或者只需要一个眼线,你可以这样做:

代码语言:javascript
复制
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中非常有用。

票数 0
EN

Stack Overflow用户

发布于 2017-09-27 11:30:42

正如Graham所说,你使用list的方式是错误的。下面的代码可以给你更好的想法。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40767388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档