2016-04-17 6 views
0

Kann jemand mir helfen, diese Liste Verständnis zu korrigieren:Liste Verständnis Fehler

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

Weil ich die folgenden Fehler

UnboundLocalError: local variable 'item' referenced before assignment 

Antwort

3

Sie haben es ein bisschen erhalten Rührei:

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

Der Filter geht am Ende.

Beachten Sie auch, dass das obige Beispiel möglicherweise mehrere doppelte Zeilen in einer Zeile enthält, wenn mehr als eine Übereinstimmung in my_list vorliegt. Im Folgenden wird prüfen, ob es Übereinstimmungen gibt, dann nur einmal die Zeile:

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

macht 'Any' Kurzschlüsse wie' next', sobald es ein Element des Iterators gibt, für das der Ausdruck True ergibt? –

+1

Ja, 'any()' und 'all()' werden kurzgeschlossen. – TigerhawkT3

2

die volle Schleifen wie folgt aussehen:

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

in der gleichen Zeile Stoßen, so etwas wie dieses (nicht wahr Python-Syntax):

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

natürlich ist der .append() Teil ist für alle Comprehensions, so setzen wir es am Anfang:

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

Wenn Sie nur an Listenkompressen wie diese denken, sollte es einfach sein, herauszufinden, welche Reihenfolge verwendet wird.

Lassen Sie sich nicht verwirren, wenn Sie else Anweisungen haben. Zum Beispiel: - am Anfang else

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

mit den if:

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

würde zu interpretieren. Warum? du fragst. Nun, es hätte man wie folgt geschrieben:

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

Sie sehen, der Teil am Anfang des Verständnisses ist immer noch das gleiche wie das, was zu .append() geben wird. Die else-Klausel ist nicht Teil der Syntax für das Verständnis; Es ist ein separates Merkmal der Sprache.


@ TigerhawkT3 einen guten Punkt über any() verwenden, though.

+0

Sehr interessante/klare Erklärung, wie die Verständlichkeit zu interpretieren ist! –