2017-07-19 5 views
1

Ich habe die folgenden for Schleife und if Zustand. Ich möchte es in eine Codezeile ändern, indem ich das Listenverständnis von Python verwende. Aber ich habe keine Ahnung, warum es nicht funktioniert, da es Syntaxfehler mit '^' auf die if-Anweisung zeigt.List Verständnis mit und für Schleife

original:

for i in range(len(lines)): 
     if (lines[i].find('('))!=-1: 
      lines[i] = lines[i][0:(lines[i].find('(')-1)] 

geändert:

lines = [[lines[i][0:(lines[i].find('(')-1)]] for (i in range(len(lines))) if ((lines[i].find('('))!=-1)] 

Ich wollte nur die Liste Verständnis Methodik verwenden, die als eine von Python-Funktionen sein. Ich hoffe, dass ich etwas Neues lernen kann, da ich keine Programmiererfahrung habe. Danke für die Hilfe, Freunde!

+1

Sie habe zu viele Klammern, von denen einige syntaktisch falsch platziert sind Entfernen Sie _all_ Klammern mit Ausnahme der in den Funktionsaufrufen – DyZ

+1

Zunächst können Sie versuchen, die Klammern um '(i im Bereich (len (Zeilen)))' zu entfernen ... –

+0

Grundsätzlich möchten Sie jedoch wahrscheinlich eine einfache Schleife verwenden, damit Sie einen Verweis auf "lines [i] .find ('(') 'anstatt es immer wieder neu zu berechnen, was sehr ineffizient ist. Listen Sie Verständnis auf, aber benutzen Sie sie nicht, wenn sie Ihren Code unlesbar machen (dem Sie sich schnell nähern) oder sie zwingen Sie dazu, ineffizient zu sein (wie in diesem Fall) –

Antwort

0

können Sie versuchen, folgende (sieht wenig sauberer):

[lines[i][0:lines[i].index('(')-1] if '(' in lines[i] else lines[i] for i in range(len(lines))] 

Also, es sagt do trimming if (is in the line else leave as it is for each line.

0

Sie haben zu viele Klammern. versuchen Sie dies und sehen, ob es funktioniert.

lines = [lines[i][0:lines[i].find('(')-1] for i in range(len(lines)) if lines[i].find('(')!=-1] 
0

Ihre geänderten Code kann wie dieser

ersetzt
apply = lambda line: line[0:line.index('(') - 1] 
lines = [apply(line) for line in lines if '(' in line] 

Schreibcode durch einzelne Zeile sieht vielleicht wie cool, aber es ist nicht lesbar.

kann auch über Code einzelne Zeile wie diese

lines = [line[0:line.index('(') - 1] for line in lines if '(' in line] 

schreiben, aber es ist schwieriger zu lesen.

Und Ihr geänderter Code stimmt nicht genau mit dem Original überein. Linien in Original-Code-String enthalten, die nicht haben ‚(‘ aber Linien in veränderter Code nur Linien enthalten angewendet.

1

Sie gehen sogar noch kürzer, wenn Sie range() fallen und verwenden .split() statt .find().

lines = [line.split('(')[0] for line in lines] 
Verwandte Themen