2017-07-19 1 views
1

J'ai la suivante for boucle et if condition. Je voudrais le changer à une ligne de code en utilisant la compréhension de liste de Python. Mais, je n'ai aucune idée pourquoi cela ne fonctionne pas comme, il dit erreur de syntaxe avec '^' pointant sur l'instruction if.Liste de compréhension avec si et pour la boucle

d'origine:

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

changé à:

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

Je voulais juste utiliser la méthode de compréhension de la liste qui est dit être l'une des caractéristiques de python. J'espère apprendre quelque chose de nouveau, car je n'ai pas d'expérience en programmation. Merci pour l'aide, les amis!

+1

Vous Supprimez toutes les parenthèses, dont certaines sont incorrectement placées de manière syntaxique Supprimez toutes les parenthèses sauf celles des appels de fonction – DyZ

+1

Pour commencer, vous pouvez essayer de supprimer les parenthèses autour de '(i dans la plage (len (lignes)))' ... –

+0

Fondamentalement, cependant, vous voulez probablement utiliser une boucle simple pour cela, donc vous pouvez garder une référence à 'lines [i] .find ('(') 'au lieu de le recalculer encore et encore, ce qui est très inefficace. Listez les compréhensions mais ne les utilisez pas si elles rendent votre code illisible (que vous approchez rapidement) ou qu'elles vous forcent à être inefficaces (comme dans ce cas) –

Répondre

0

Vous pouvez essayer de suivre (semble peu plus propre):

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

Ainsi, il dit do trimming if (is in the line else leave as it is for each line.

0

Vous avez trop de parenthèses. Essayez ceci et voyez si cela fonctionne.

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

votre code modifié peut remplacer ce code comme

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

d'écriture par une seule ligne peut ressemble cool, mais ce n'est pas lisible.

également le code ci-dessus peut écrire une seule ligne comme celui-ci

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

mais il est plus difficile à lire.

Et votre code modifié n'est pas exactement le même que l'original. lignes dans le code d'origine contiennent la chaîne qui n'ont « (» mais les lignes dans le code modifié ne contiennent appliqué les lignes.

1

Vous pouvez aller encore plus court si vous laissez tomber range() et utiliser .split() au lieu de .find().

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