2012-10-19 45 views
2

我碰到一段代碼,上面寫着:列表理解語法

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語句的東西嗎?

+6

不,這正是它是什麼。你說對了。 –

回答

2

正如其他人已經指出,這正是它的意思。

我還發現有時在列表理解/基因組中使用多個令人困惑,所以我通常會避免它們。當我使用他們,我通常把每一個在不同的線路,如:

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混合使得所有的操作都非常麻煩,而且根本不可讀。

+2

在我需要開始縮進列表理解時,可能會變得太複雜。到那時,我會轉換到常規代碼,以確保清晰。 – ckb

+1

你說得對。當我有兩個'for',或者我有'for'和'if',表達式需要一些空間(這樣行會太長)時,我實際上只使用它。任何比這更復雜的事情都可以用「常用的方式」來完成。 – Bakuriu

4

你擁有它完全正確。看到list comprehension documentation

當提供一個列表理解,它由一個單一的表達,隨後在至少一個for子句和零項或多個forif條款。在這種情況下,新列表的元素是那些通過考慮forif子句中每一個從左到右嵌套並評估表達式以在每次到達最內層塊時產生列表元素。

所以你對for循環嵌套的解釋是現貨。