2016-06-28 2 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 'または' device-group '...など。listとpop()要素を繰り返している間にインデックスエラーが発生する

私は本当に理由を理解していない。それは私の範囲としてLEN(t)を使用して、完全な長さだ場合、どのように私のインデックスが範囲外になることができますか?

目標は、私のリストそこから任意のインデックスをポップすることですこれらの部分文字列のいずれかを含む。どのような援助をありがとう!

+1

9行目はprint(i、t [i])が正しいですか?そうであれば、それは意味をなさないので、あなたはもはやその場所にアクセスすることができません。ポップアップを行う前に印刷してみてください。 – FirebladeDan

+0

あなたの 'if'文は意味的に' python'で完全に無効です。 'True'と評価される最初の値を選択し、それがあなたのリストにあるかどうかをテストします。 –

+3

'( '継承'または 'デバイスグループ'または 'パーティション'または'テンプレート'または 'トラフィックグループ')== '継承'。 't [i]'にあるものがあるかどうかを知りたければ 'any'を使います。 – jonrsharpe

答えて

0

それをループしているときに、リストを編集しているので、これが起こります、 あなたはまず長さを例えば10にしてから、物事を10回ループします。 1つのものを削除するとすぐにリストは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' '継承される前に空白に注意してください。 –

+0

@ChristiandelaPeñaこれを正しく行うには、読んでいるtxtのサンプルを提供する必要があります。さもなければ私達は両方とも私達の時間を腰掛けている。私はそれをすべて書く前にそれを求めていたはずです。 –

0

はのはlen(t) == 5を言ってみましょう。

我々はi撮影は、我々はi = 0を処理した後、我々はtから一つの値をポップ[0,1,2,3,4]

値処理します。len(t) == 4i = 4になると、これはエラーを意味します。しかし、rangeは既に4になっているので、私たちはまだ4に行くつもりです。

次は(i = 1)ステップはi = 3のエラーを確実にします。

ステップ(i = 2)は、i = 2のエラーを確実にしますが、すでに処理されています。

次(i = 3)ステップでエラーが発生します。

代わりに、あなたはこのような何か行う必要があります。ループ内

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

そして:

if qualities_we_need & set(element): 
    print(element) 
サイドノートで

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

を、あなたはセットでそのinチェックを交換する必要があります

インデックスが必要な場合は、1つ以上の変数を使用してインデックスを管理するか現在処理中または使用中の価値がありますenumerate()

関連する問題