2017-09-03 32 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

相关问题