我碰到一段代碼,上面寫着:列表理解語法
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
這是等價的:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
或者這是否預示比其他嵌套for語句的東西嗎?
我碰到一段代碼,上面寫着:列表理解語法
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
這是等價的:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
或者這是否預示比其他嵌套for語句的東西嗎?
正如其他人已經指出,這正是它的意思。
我還發現有時在列表理解/基因組中使用多個令人困惑,所以我通常會避免它們。當我使用他們,我通常把每一個在不同的線路,如:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
甚至縮進:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
這清楚這是內部的循環。
而且,列表理解可以有一個,如果每一個for循環的表達,所以完整的語法是這樣的:
queue = [(Xi, Xk) for Xi in csp.vars
if condition_one()
for Xk in csp.neighbors[Xi]
if condition_two()
... ]
即使我希望你永遠不會寫類似的東西。最後的if表達式很好,但是將它與for混合使得所有的操作都非常麻煩,而且根本不可讀。
你擁有它完全正確。看到list comprehension documentation:
當提供一個列表理解,它由一個單一的表達,隨後在至少一個
for
子句和零項或多個for
或if
條款。在這種情況下,新列表的元素是那些通過考慮for
或if
子句中每一個從左到右嵌套並評估表達式以在每次到達最內層塊時產生列表元素。
所以你對for循環嵌套的解釋是現貨。
不,這正是它是什麼。你說對了。 –