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
我得到流行指數超出範圍,但據我檢查有沒有搞錯..請幫幫我,快錯誤:索引超出範圍
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
我得到流行指數超出範圍,但據我檢查有沒有搞錯..請幫幫我,快錯誤:索引超出範圍
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中非常有用。
由於格雷厄姆說你錯誤地使用列表。下面的代碼可以給你更好的想法。
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
您正在修改正在迭代的同一個容器。這通常是「壞事」(Bad Thing)™。做一個*拷貝*來迭代。 –
或者使用列表解析:'n = [如果沒有%5> 0,否則不在n中]' – Phylogenesis