我不知道如何做出以下爲理解:列表/ 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
會得到一個錯誤愛一些幫助!謝謝!
我不知道如何做出以下爲理解:列表/ 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
會得到一個錯誤愛一些幫助!謝謝!
翻譯這些循環是
[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
謝謝你的回答!清晰度非常有幫助,很高興聽到打印出的SyntaxError聲明。我的意圖是存儲一個列表,而不是打印,但是在檢查循環是否正常工作時,我意外地將打印語句留在了這裏。 –
@FlowNuwen很高興我能幫上忙。如果你的意圖是存儲一個列表,那麼我最初寫的是你如何編寫列表理解:所有的for循環是一個接一個的,最內層的if語句是在最後。請注意,要麼你有一個if語句,要麼你沒有。在列表理解中你不能有多個if語句。 – rubik
規則1 - 保持for
和if
部件的順序相同。唯一改變順序的部分是最後一部分,即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])]
我可以問這些規則的源代碼 – Julius
第一個是簡單的轉換是如何工作的。第二個不是一個「規則」,而是一個最佳實踐。我把它當作一條規則來對待:我從不寫有副作用的列表推導。 –
謝謝!我的意圖不是打印,但我只是把它放在原來的工作檢查。 –
一般來說,循環使用的副作用(如打印)不借給自己被拍成內涵... – mgilson
你知道打印返回'None'嗎? –
@leaf - 它看起來像OP是python2.x其中'print'是一個語句(當然,禁止'__future__'導入)。 – mgilson