Comments on: itertools.product fait sauter des boucles imbriquées http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/ Du code, du cul Sat, 07 Nov 2015 11:08:18 +0000 hourly 1 http://wordpress.org/?v=4.1 By: Fred http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165829 Tue, 03 Nov 2015 17:51:24 +0000 http://sametmax.com/?p=16986#comment-165829 @Symen : l’imbrication se fera selon, l’ordre des éléments passés à “product()”. Typiquement, dans l’exemple, il commencera par itérer “trucs” et pour chaque élément de “trucs” il y aura une itération sur “machins”…

]]>
By: Sam http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165827 Tue, 03 Nov 2015 17:10:17 +0000 http://sametmax.com/?p=16986#comment-165827 @o: la list comprehension devient vite moins lisible, particulièrement avec des noms longs et si il y a plus de deux itérables. Par ailleurs, elle ne fonctionne que si on souhaite faire des opérations simples car on n’a pas la possibilité de faire un bloc de plusieurs lignes pour le résutlat.

]]>
By: Symen http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165821 Tue, 03 Nov 2015 14:19:16 +0000 http://sametmax.com/?p=16986#comment-165821 Plutôt sympa comme astuce, je penserai à l’utiliser!

Par contre je trouve qu’on ne voit pas clairement dans quel ordre va se dérouler l’itération (quel “for” sera imbriqué), donc dans le but de rester explicite c’est peut-être mieux de ne l’utiliser seulement lorsque l’ordre n’est pas important ?

]]>
By: Ryzz http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165819 Tue, 03 Nov 2015 13:56:14 +0000 http://sametmax.com/?p=16986#comment-165819 @furankun:

Oups, ce n’est pas exactement la même chose:

In [18]: [[(i, j) for j in b] for i in a]

Out[18]:

[[(1, 'a'), (1, 'b'), (1, 'c')],

[(2, 'a'), (2, 'b'), (2, 'c')],

[(3, 'a'), (3, 'b'), (3, 'c')]]

In [19]: [(i, j) for j in b for i in a]

Out[19]:

[(1, 'a'),

(2, 'a'),

(3, 'a'),

(1, 'b'),

(2, 'b'),

(3, 'b'),

(1, 'c'),

(2, 'c'),

(3, 'c')]

]]>
By: floweb http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165818 Tue, 03 Nov 2015 13:52:57 +0000 http://sametmax.com/?p=16986#comment-165818 Ok, merci @Ryzz ! TIL.

]]>
By: Ryzz http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165817 Tue, 03 Nov 2015 13:48:51 +0000 http://sametmax.com/?p=16986#comment-165817 @furankun:

Dans la docstring de product:

Cartesian product of input iterables. Equivalent to nested for-loops.

For example, product(A, B) returns the same as: ((x,y) for x in A for y in B).

Donc, oui c’est la même chose, sauf que ça te renvoie un itérateur au lieu d’une liste.

@floweb: Non, zip ne fait qu’une seule association là où product te fait toutes les associations possible:

In [11]: a = [1, 2, 3]

In [12]: b = ['a', 'b', 'c']

In [13]: for i in itertools.product(a, b):

print(i)

....:

(1, 'a')

(1, 'b')

(1, 'c')

(2, 'a')

(2, 'b')

(2, 'c')

(3, 'a')

(3, 'b')

(3, 'c')

]]>
By: floweb http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165816 Tue, 03 Nov 2015 13:04:54 +0000 http://sametmax.com/?p=16986#comment-165816 C’est comme zip(), ou j’ai pas compris ?

a = [1, 2, 3]

b = ['a', 'b', 'c']

for i, j in zip(a, b):

... print i, j

...

1 a

2 b

3 c

]]>
By: Matthieu http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165815 Tue, 03 Nov 2015 13:02:24 +0000 http://sametmax.com/?p=16986#comment-165815 C’est super pratique lorsqu’on veut faire une boucle imbriquée sur un nombre d’éléments variable, comme les array numpy.

Exemple pour faire (x**2).sum():

sum(x[e]**2 for e in itertools.product(*map(range, x.shape)))

Belle photo, vous êtes à gauche non ?

]]>
By: trnsnt http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165807 Tue, 03 Nov 2015 10:17:37 +0000 http://sametmax.com/?p=16986#comment-165807 Un petit comment pour ajouter qu’au niveau temps d’exécution l’utilisation de product semble meilleure.

Pour machins et trucs qui valent range(1000), avec le double for on a un temps d’exécution de 0.25 s contre 0.12 s pour le product.

]]>
By: furankun http://sametmax.com/itertools-product-fait-sauter-des-boucles-imbriquees/#comment-165805 Tue, 03 Nov 2015 09:53:32 +0000 http://sametmax.com/?p=16986#comment-165805 et butt c’est avec deux T :D

Si je comprends bien ça évite juste de faire

res = [[ bidule(machin, truc) for truc in trucs] for machin in machins]

oui?

]]>