2010-06-11 11 views
1

En cherchant un moyen de simuler des boucles imbriquées (ou un produit cartésien), je suis tombé sur la fonction itertools.product. J'ai besoin d'une fonction ou d'un morceau de code qui reçoit une liste d'entiers en entrée et renvoie un générateur spécifique.Entrée python pour itertools.product

exemple:
entrée = [3,2,4] -> gen = produit (xrange (3), xrange (2), xrange (4))

ou entrée = [2,4, 5,6] -> gen = produit (xrange (2), xrange (4), xrange (5), xrange (6))

comme la taille des listes varie je suis très confus dans la façon de le faire sans avoir besoin de beaucoup de précodage basé sur une quantité folle de si et la taille de la liste.

Y a-t-il également une différence entre le produit appelant (gamme (3)) ou le produit (gamme (3))?

Répondre

2
def bigproduct(*args): 
    newargs = [xrange(x) for x in args] 
    return itertools.product(*newargs) 

for i in bigproduct(3, 2, 4): 
    .... 

range() génère une liste à l'avance, utilise donc du temps avant et plus d'espace, mais prend moins de temps pour obtenir chaque élément. xrange() génère chaque élément à la volée, prend ainsi moins de place et de temps initial, mais prend plus de temps pour renvoyer chaque élément.

+0

+1 Permettez-moi d'ajouter deux détails: 1) En Python 3, 'range()' 'se comporte comme xrange()' 2) Dans la mise en œuvre CPython de Python 2, 'xrange' est limité au type de données C' long' (ie 'xrange (int (2 ** 31-1))' est typiquement la gamme max). Frappez celui-là une fois ... – stephan

-1

Ceci peut être facilement réalisée en utilisant la carte:

from itertools import product 
for i in product(*map(range, shape)): 
    print i 
+0

qu'est-ce que 'shape'? Est-ce une référence chiffrée? – cowbert