2017-07-19 33 views
1

我有以下for循環和if條件。我想使用Python的列表理解將其更改爲一行代碼。但是,我不知道爲什麼它不起作用,它說'^'指向if語句的語法錯誤。使用if和for循環的列表理解

原:

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

改爲:

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

我只是想用列表解析方法,它被認爲是Python的特點之一。希望能夠學習新的東西,因爲我沒有編程經驗。感謝您的幫助,朋友們!

+1

你有很多括號,其中一些語法錯誤地放置在句法上。刪除_all_圓括號,除了那些在函數調用中的括號。 – DyZ

+1

對於初學者,你可以嘗試刪除'(in range(len(lines))' ... –

+0

儘管基本上,您可能希望使用一個簡單的循環,因此您可以保留對'lines [i] .find('( ')'而不是一遍又一遍的重新計算,這是非常低效的。列表解析,但不要使用它們,如果他們讓你的代碼不可讀(你正在迅速接近),或者他們強迫你效率低下(如在這種情況下) –

回答

0

你可以試試以下(看起來少許清潔劑):

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

所以,它說do trimming if (is in the line else leave as it is for each line

0

括號太多。 試試看看它是否有效。

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

你改變的代碼可以取代像通過單線這個

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

寫的代碼可能看起來像很酷,但它不是可讀。

還上面的代碼可以寫一行這樣

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

但它更難以閱讀。

您更改的代碼與原始代碼不完全相同。 行原代碼包含字符串,沒有「(」但在改變的代碼行只包含應用於線。

1

即使你刪除range()你可以去更短,用.split()代替.find()

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