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索引超出了范围,但据我所知,没有错误..请帮帮我,快点
发布于 2016-11-23 23:25:00
解释
You are using pop() wrong. pop(x)接受一个参数,并弹出或删除该索引,而不是项。所以当你弹出索引时,你不是从列表中弹出一个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()-ing it。现在,在我们浏览列表时更改列表是一个坏主意。为什么?
在遍历容器(循环遍历)时修改容器(在本例中是pop()ing a 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中非常有用。
发布于 2017-09-27 11:30:42
正如Graham所说,你使用list的方式是错误的。下面的代码可以给你更好的想法。
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 nhttps://stackoverflow.com/questions/40767388
复制相似问题