2016-06-28 25 views
0
import os 
os.chdir('G:\\f5_automation') 
r = open('G:\\f5_automation\\uat.list.cmd.txt') 
#print(r.read().replace('\n', '')) 
t = r.read().split('\n') 
for i in range(len(t)): 
    if ('inherited' or 'device-group' or 'partition' or 'template' or 'traffic-group') in t[i]: 
     t.pop(i) 
     print(i,t[i]) 

在上面的代碼中,我得到了第9行的索引錯誤:'if('inherited'or'device-group'... etc。迭代遍歷列表和pop()時發生索引錯誤 - ing元素

我真的不明白,爲什麼,怎麼能我的索引超出範圍,如果它是通過使用LEN(T)作爲我的範圍內完美的長度是多少?

的目標是彈出從我的列表中的任何指標是包含任何這些子字符串。謝謝您的協助!

+1

第9行是print(i,t [i])是否正確?如果是這樣,這是有道理的,你不能再訪問該位置,因爲它已被彈出。在做流行音樂之前嘗試打印。應該很好 – FirebladeDan

+0

你的'if'語句在語義上完全無效'python'。它會選擇第一個值作爲「真」,並測試它是否在你的列表中,而不是檢查它是否在其中。 –

+3

你是否意識到'('inherited'或'device-group'或'partition'或'模板'或'流量組')=='繼承'。如果你想知道是否有't [i]',使用'any'。 – jonrsharpe

回答

0

發生這種情況是因爲您在編輯列表時循環播放, 你首先得到例如10的長度,然後你循環10次。但是一旦你刪除了一件東西,這個列表將只有9個長。 解決這個問題的一個方法是創建一個你想要保留的東西的新列表,而不是使用它。

我已經稍微編輯了你的代碼並做了類似的事情。

t = ['inherited', 'cookies', 'device-group'] 

interesing_things = [] 
for i in t: 
    if i not in ['inherited', 'device-group', 'partition', 'template', 'traffic-group']: 
     interesing_things.append(i) 
     print(i) 
0

正如很多人在評論中所說的那樣,您的代碼有幾個問題。

or運算符將其左側和右側的值視爲布爾值,並返回第一個值爲True(從左到右)。所以你的括號評估爲'繼承',因爲任何非空字符串是True。因此,即使您的for loop工作正常,您也會彈出僅等於「繼承」的元素。

for loop雖然不工作。發生這種情況的原因是,當您循環訪問的列表大小發生變化時,如果列表元素實際上等於「繼承」並彈出,您將收到索引超出範圍錯誤。

那麼,來看看這個:

import os 
os.chdir('G:\\f5_automation') 
r = open('G:\\f5_automation\\uat.list.cmd.txt') 
print(r.read().replace('\n', '')) 
t = r.read().split('\n') 
t_dupl = t[:] 
for i, items in enumerate(t_dupl): 
    if items in ['inherited', 'device-group', 'partition', 'template', 'traffic-group']: 
     print(i, items) 
     t.remove(items) 

通過複製原始列表中,我們可以使用它的項目作爲項目的「池子」從挑選和修改的列表,我們真正感興趣的。

最後,知道pop()方法返回它從列表中移除的項目,這是你不需要的例子。 remove()適合你。


作爲一個側面說明,你也許可以用這個代替你的第5行代碼:

with open('G:\\f5_automation\\uat.list.cmd.txt', 'r') as r: 
    t = r.readlines() 

使用with語句的優點是,它會自動處理文件由封閉本身當閱讀完成時。最後,不要閱讀整個文件並將其拆分爲換行符,而只需使用內置的readlines()方法即可。

+0

這對我不起作用。我認爲這是因爲「繼承」,「設備組」等。是也是字符串的列表對象的子字符串。這裏是一個例子:'print(t [3]); inherited-traffic-group true'注意'inherited'之前的空格 –

+0

@ChristiandelaPeña要正確地做到這一點,您必須提供您正在閱讀的txt的示例。否則我們都在等待我們的時間。在寫完所有內容之前,我應該先徵求它。 –

0

比方說len(t) == 5

我們會處理i取值[0,1,2,3,4]

我們處理i = 0後,我們從彈出一個t價值。len(t) == 4現在。這意味着錯誤,如果我們得到i = 4。然而,我們仍然會嘗試上升到4,因爲我們的range已被編入爲4

下一步(i = 1)步驟確保在i = 3上發生錯誤。

下一步(i = 2)步驟確保在i = 2上發生錯誤,但已處理該錯誤。

下一步(i = 3)步驟會產生錯誤。

相反,你應該做這樣的事情:

while t: 
    element = t.pop() 
    print(element) 

在一個側面說明,你應該替換in檢查與集:

qualities_we_need = {'inherited', 'device-group', 'partition'} # put all your qualities here 

然後在循環:

if qualities_we_need & set(element): 
    print(element) 

如果你需要索引,你可以使用一個多變量來跟蹤索引我們正在處理的價值,或使用enumerate()