2016-04-25 137 views
0

我想從列表中刪除一些數組。但是我使用了錯誤的範圍。 開始時範圍是正確的。 這應該工作,如果字符串中變量的結果並[b] [2:3]然後刪除結果並[b]什麼是正確的迴路範圍

for b in range(len(result)): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 

之後我有錯誤:IndexError:列表索引超出範圍


我想找到這個字符串,並刪除整行(陣列):

V;4;FillLevel[1];CPUA.DB1610.0,I0,64;RW 
V;4;FillLevel[2];CPUA.DB1610.0,I;RW 
V;4;FillLevel[5];CPUA.DB1610.6,I;RW 
V;4;FillLevel[6];CPUA.DB1610.8,I;RW 
V;4;FillLevel[11];CPUA.DB1610.18,I;RW 

爲什麼這段代碼:

print(result[4][2:3]) 
print(result[5][2:3]) 
print(result[6][2:3]) 
print(result[7][2:3]) 
print(result[8][2:3]) 
print(result[9][2:3]) 
print(result[10][2:3]) 

b = 0 
while b < len(result): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
     del adress[b] 
     print('yes') 
    b += 1 

只顯示一次'是'?

['FillLevel'] 
['FillLevel[1]'] 
['FillLevel[2]'] 
['FillLevel[3]'] 
['FillLevel[4]'] 
['FillLevel[5]'] 
['FillLevel[6]'] 
yes 
+0

你是什麼意思** *「如果字符串變量結果[b] [2:3]」***?我不確定這是否合理。 –

+1

請參閱[本答案](http:// stackoverflow。com/questions/1207406/remove-items-from-a-list-while-iterating-in-python)瞭解如何從列表中刪除項目。 –

+0

@MatthewCliatt它確實有道理,但它很可能與'if'FillLevel'== result [b] [2]'沒有什麼不同。 –

回答

1

的問題是,del result[b]改變組合物(和的長度)result,從而與循環干擾。

也許是爲了解決這個問題最簡單的方法是通過改寫你的代碼清單理解:

result = [r for r in result if 'FillLevel' not in r[2:3]] 

或者,你可以通過反向迭代修復:

for b in range(len(result) - 1, -1, -1): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
1

比方說,有列表中的10個項目。

通過您的中途刪除其中一個項目;現在列表中有9個項目。

在上一個循環中,您的循環要求第十個項目。我的猜測是,也正是指數誤差正在發生的事情(儘管它可能是由於[2:3]通話以及,根據您的列表中的內容)

一個更Python的解決辦法是

result = [val for val in result if 'FillLevel' not in val[2:3]] 
0

如果您要保持相同的列表,並解析它在海峽順序,你可以使用while循環,其評估每個迭代

b = 0 
while b < len(result) : 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
    b += 1 
+0

問題已更新。 – Luka

0

爲第一 的len(result) - 這是馬赫easyer通過列表機智迭代熱得到長度,可能你得到一個錯誤因爲長度的列表正在改變在循環 第二 - 你正試圖檢查'FillLevel'的字符串片。切片返回一個字符 - 儘量不midify您的列表,但使新的有過濾項 這樣的:

new_list = [] 
for b in result: 
    if 'FillLevel' not in b: 
     new_list.append(b) 

或檢查約List Comprehensions和輸入:

[i for i in result if 'FillLevel' not in i] 
+0

我正在嘗試使用你的第一個解決方案。但是如果我有'FillLevel [5],FillLevel [7]'..等等,這是行不通的。 我試圖使用'如果'FillLevel ['不在b' - 但這也行不通。 – Luka

+0

可能你的切片不是無用的,我可能對你的'結果'內容錯誤。嘗試在這裏添加它:如果'FillLevel'不在b [2]中: – Matroskin