2010-04-27 7 views
1

Y at-il une meilleure façon de le faire:produit dans la gamme multiple en Python

perms = product(range(1,7),range(1,7),range(1,7)) 

afin que je puisse choisir le nombre de gammes j'utiliser? Je veux que ce soit équivalent à cela, mais évolutif.

def dice(num) 
    if num == 1: 
     perms = ((i,) for i in range(1,7)) 
    elif num == 2: 
     perms = product(range(1,7),range(1,7)) 
    elif num == 3: 
     perms = product(range(1,7),range(1,7),range(1,7)) 
    #... and so on 

mais je sais qu'il doit y avoir un meilleur moyen. Je l'utilise pour compter les résultats des dés. Le code réel

def dice(selection= lambda d: d[2]): 
    perms = itertools.product(range(1,7),range(1,7),range(1,7))  
    return collections.Counter(((selection(sorted(i)) for i in perms))) 

où je peux l'appeler avec une variété de sélecteurs, comme sum(d[0:2]) pour la somme des 2 dés les plus bas ou d[1] pour obtenir les dés du milieu.

Répondre

10

Oui. Utilisez l'argument mot-clé repeat:

perms = product(range(1, 7), repeat=3) 

Voir la docs plus.

+0

ooh, bon appel, je ne savais pas à ce sujet. +1 –

+0

Oh, comment ça m'a manqué? J'étais même sur cette page de doc. * facepalm * Merci –

+0

Légèrement reliée: Y at-il une différence si vous utilisez 'irange'? Je suis dans le cas où mes gammes dans mon «produit» sont grandes. – Annan

0

Je pense

perms = itertools.product(*([xrange(1,7)]*num)) 

devrait travailler pour vous.

Questions connexes