2017-09-03 70 views
-2

我正在閱讀一本Python書,並遇到了'itertools.chain'。我想知道是否有可能將有關2D數組的以下代碼轉換爲「itertools.chain」。是否有可能將兩個迭代轉換爲Python中的「itertools.chain」操作?

我的第二個問題是:使用'itertools.chain'與兩個for-loops相比有什麼好處?

for row in range(rows): 
    some operation on rows 
    for col in range(columns): 
     some operations on cell i,j 

謝謝!

+0

怎麼樣具體的投入和期望的輸出?這將有助於理解你想要做什麼。 –

+1

不,你可以把'chain'看作*鏈接* for-loops的一個接一個。你想'行',col in itertools.product(範圍(行),範圍(列)' –

+0

@ juanpa.arrivillaga謝謝你的答案!使用'itertools.chain/product'與2 for-循環? –

回答

2

這裏您不會使用chain,因爲chain會針對每行運行一次,然後針對每列(#rows + #cols)運行一次,而不是針對每個單元(#rows * #cols)運行一次。

你想要的是itertools.product。但它只適用於單獨操作單元的情況;如果您需要執行每行操作,則最好使用顯式嵌套循環。該product的做法是:

for row, col in itertools.product(range(rows), range(columns)): 
    some operations on cell row,col 
+0

感謝您的回答!有什麼好處使用'itertools.chain/product'與2個for循環進行比較? –

+0

@LeiHao更短/更混淆的代碼 –

+0

@LeiHao:它也可以遞增更快;例如,在這種情況下,只能創建兩個'range'對象,而不是'#rows + 1''range'對象(嵌套循環也可以這樣做,通過在循環外創建一個'range(columns)'並重用它,但這更加冗長和醜陋)。微不足道的基於可讀性/功能性的決定,這樣的性能微觀優化很少值得。 – ShadowRanger

相關問題