2016-04-17 20 views
0

は、誰かがこのリストの内包を修正するために私を助けることができます:リスト内包エラー

line_list = [line for line in file.splitlines() for item in my_list if item in line] 

line_list = [line for line in file.splitlines() if item in line for item in my_list] 

私は次のエラー

UnboundLocalError: local variable 'item' referenced before assignment 

答えて

3

を取得するので、あなたはそれが少しスクランブル持っていますフィルタは最後に行きます。

my_listに2つ以上の一致がある場合、上記の行に複数の重複した行が挿入されることがあります。以下は、任意の一致があるかどうかを確認、その後、一度だけの行を追加します。同じ行に入れ

line_list = [] 
for line in file.splitlines(): 
    for item in my_list: 
     if item in line: 
      line_list.append(line) 

、このような何か(真実ではない:

line_list = [line for line in file.splitlines() if any(item in line for item in my_list)] 
+0

'next'のような' any'短絡は、式がTrueと評価されるイテレータの要素があるとすぐにですか? –

+1

はい、 'any()'と 'all()'は短絡します。 – TigerhawkT3

2

フルループは次のようになりPythonの構文):もちろん

line_list = [] 
for line in file.splitlines(): for item in my_list: if item in line: line_list.append(line) 

.append()部分は、すべての内包表記に共通しているので、我々は最初にそれを置く:

line_list = [line for line in file.splitlines() for item in my_list if item in line] 

このようなリスト内包語を考えれば、どのような順序が使用されているか把握しやすいはずです。

elseステートメントがあるときに混乱させないようにしてください。冒頭でelseからif

line_list = ["no" if line == "yes" else line for line in file.splitlines()] 

:たとえば:

line_list = [] 
for line in file.splitlines(): 
    if line == "yes": 
     line_list.append("no") 
    else: 
     line_list.append(line) 

はに解釈されます。どうして?あなたが尋ねる。まあ、それはこのように書かれている可能性:

line_list = [] 
for line in file.splitlines(): 
    line_list.append("no" if line == "yes" else line) 

あなたは見、理解の冒頭部分はまだ.append()に渡されたものと同じです。 else句は、理解の構文の一部ではありません。それは言語の別の特徴です。 TigerhawkT3 @


しかし、any()を使用する方法について良い点を作りました。

+0

非常に興味深い/明確な解説の解釈方法についての説明! –