2017-09-03 2 views
-2

Je suis en train de lire un livre Python et j'ai rencontré 'itertools.chain'. Je me demande s'il est possible de convertir le code suivant concernant un tableau 2D en 'itertools.chain'. Ma deuxième question est: quel est l'avantage d'utiliser 'itertools.chain' comparé à deux for-loops?Est-il possible de convertir deux itérations en opération 'itertools.chain' en Python?

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

Merci!

+0

Qu'en est-il de l'entrée de béton et de la sortie désirée? Cela aiderait à comprendre ce que vous voulez faire. –

+1

Non, vous pouvez considérer 'chain' comme l'équivalent de * chaining * for-loops, l'un après l'autre. Vous voulez 'pour row, col dans itertools.product (range (rows), range (columns)' –

+0

@ juanpa.arrivillaga Merci pour la réponse! Quel est l'avantage d'utiliser 'itertools.chain/product' comparer à 2 for- boucles –

Répondre

2

Vous n'utiliser chain ici, parce que chain irait une fois pour chaque ligne, puis une fois pour chaque colonne (#rows + #cols), et non pour chaque cellule (#rows * #cols).

Ce que vous voulez est itertools.product. Mais cela ne fonctionne que si vous opérez sur les cellules individuellement; Si vous devez effectuer une opération par ligne, il vaut mieux utiliser la boucle imbriquée explicite. L'approche product serait:

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

Merci pour la réponse! d'utiliser 'itertools.chain/product' comparez à 2 for-loops? –

+0

@LeiHao Shorter/plus de code obfusqué –

+0

@LeiHao: Il peut aussi être incrémentalement plus rapide, par exemple dans ce cas, vous ne créez que deux objets 'range', pas les objets '#rows + 1'' range' (les boucles imbriquées pourraient le faire aussi, en créant un seul 'range (columns)' en dehors de la boucle et en le réutilisant, mais c'est encore plus bavard et laid). trivial; faire le décision basée sur la lisibilité/fonctionnalité, les micro-optimisations de performance comme ça en valent rarement la peine. – ShadowRanger