2016-11-23 217 views
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(no) 

print n 

我得到流行指數超出範圍,但據我檢查有沒有搞錯..請幫幫我,快錯誤:索引超出範圍

+1

您正在修改正在迭代的同一個容器。這通常是「壞事」(Bad Thing)™。做一個*拷貝*來迭代。 –

+0

或者使用列表解析:'n = [如果沒有%5> 0,否則不在n中]' – Phylogenesis

回答

0

Explaintion

You are using pop() wrong.pop(x)需要一個參數並彈出或刪除該索引,而不是項目。所以當你pop(5)你沒有從列表中彈出5,你會彈出索引5。這就是爲什麼你得到一個索引超出範圍的錯誤。試試這個(注意,這仍然是錯誤的,但它是爲教學着想做什麼POP):

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它。現在,當我們正在經歷它時,更改列表並不是一個好主意。爲什麼?

修改容器(在這種情況下pop()荷蘭國際集團一list),而你是通過它迭代(通過其循環)的問題是,你有可能回落值。這裏有一個例子:

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

爲什麼它僅包含在循環後[6],而不是一個空的名單?那麼第一次迭代它刪除這是在指數0,這是很好的,但現在的名單是[6,7]5的第一個項目,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的項目,我們可以添加項目,如果它不等於零。

如果你想要更多的東西「Python化」或看中的還是一個班輪你可能只是這樣做:

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

由於格雷厄姆說你錯誤地使用列表。下面的代碼可以給你更好的想法。

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