2016-10-12 52 views
0
條件理解

我不知道如何做出以下爲理解:列表/ Python中

for g in a: 
    for f in g[::3]: 
     if f == clf.best_params_: 
      print g 

我嘗試這樣做:

p = [[print g for g in a] if f==clf.best_params for f in [g[::3] for g in a]] 
p 

for f in

會得到一個錯誤愛一些幫助!謝謝!

+2

一般來說,循環使用的副作用(如打印)不借給自己被拍成內涵... – mgilson

+0

你知道打印返回'None'嗎? –

+0

@leaf - 它看起來像OP是python2.x其中'print'是一個語句(當然,禁止'__future__'導入)。 – mgilson

回答

2

翻譯這些循環是

[print g for g in a for f in g[::3] if f == clf.best_params_] 

然而,在Python 2 print g正確的方法是一個聲明,這就是爲什麼你會得到一個SyntaxError。 Python 3的對應部分(即print(g))會起作用,但請注意,這裏的列表理解完全沒有用處。當你必須將值收集到一個列表中時,列表理解很有用 - 在這裏它會妨礙可讀性。

關於SyntaxError,這不是這裏的主要問題。請注意,您可以使用

from __future__ import print_function 

,然後,你會使用print()功能列表理解在Python 3

+0

謝謝你的回答!清晰度非常有幫助,很高興聽到打印出的SyntaxError聲明。我的意圖是存儲一個列表,而不是打印,但是在檢查循環是否正常工作時,我意外地將打印語句留在了這裏。 –

+0

@FlowNuwen很高興我能幫上忙。如果你的意圖是存儲一個列表,那麼我最初寫的是你如何編寫列表理解:所有的for循環是一個接一個的,最內層的if語句是在最後。請注意,要麼你有一個if語句,要麼你沒有。在列表理解中你不能有多個if語句。 – rubik

1

我想你混淆了結構:這是一個列表理解,不某種宏。

你不會得到這種副作用;列表理解的目的是構建一個列表。

+1

你*儘管*獲得副作用。該列表然後充滿無用的值。另一方面,我同意你的觀點,這裏的列表理解完全被濫用。 – rubik

+1

你可以在列表推導中得到副作用,例如。改變名單,但這是非常糟糕的做法。這個例子試圖使用一個甚至不正確的語法'print''語句 – jamylak

1

規則1 - 保持forif部件的順序相同。唯一改變順序的部分是最後一部分,即print g:即移到前面。

[print g for g in a for f in g[::3] if f == clf.best_params_] 

第2所 - 列表理解不應該做任何。而不是印刷g,有g是積累的價值。

[g for g in a for f in g[::3] if f == clf.best_params_] 

如果你的整個目標只是打印東西,堅持原來的循環;列表理解不會增加任何價值。


如果我們再看看你原來的嵌套循環,有可能會寫他們一個更好的辦法。您的目標是找到clf.best_params_其中一個匹配位置的所有項目g?如果是這樣,我建議用一個if any語句替換內部循環。

for g in a: 
    if any(f == clf.best_params_ for f in g[::3]): 
     print g 

對我來說,這樣會更好。邏輯更清晰。它只會打印一次g的任意一個值,而不是多次出現clf.best_params_多次。

如果這是一種進步,那麼你可以該版本轉換到一個列表理解像這樣:

[g for g in a if any(f == clf.best_params_ for f in g[::3])] 
+0

我可以問這些規則的源代碼 – Julius

+0

第一個是簡單的轉換是如何工作的。第二個不是一個「規則」,而是一個最佳實踐。我把它當作一條規則來對待:我從不寫有副作用的列表推導。 –

+0

謝謝!我的意圖不是打印,但我只是把它放在原來的工作檢查。 –