2015-03-12 5 views
0

Je travaille sur un programme Python où je dois trouver tous les moyens de lancer 9 dés à 4 faces. J'ai essayé de trouver une façon plus concise pour écrire cette ligne:Calcul imbriqué du produit cartésien des jets de dés

for n in [sum([a, b, c, d, e, f, g, h, i]) for a in range(1, 5) for b in range(1, 5) for c in range(1, 5) for d in range(1, 5) for e in range(1, 5) for f in range(1, 5) for g in range(1, 5) for h in range(1, 5) for i in range(1, 5)]: 

Je l'ai vu une syntaxe similaire à:

for n in [sum([a, b, c, d, e, f, g, h, i]) for a, b, c, d, e, f, g, h, i in range(1, 5)]: 

mais cela donne l'erreur:

TypeError: 'int' object is not iterable 

Que se passe-t-il?

+0

@ mkrieger1 ce lien semble totalement hors de propos? – smci

+0

@AshtonBaker que l'on appelle [tag: cartésien-produit] – smci

+0

@smci merci, j'aurais dû le reconnaître. –

Répondre

3

Comme Calum a noté, vous devez utiliser le haut-itertools pour ces boucles communes.

Dans votre cas, vous voulez:

import itertools 
results = [sum(x) for x in itertools.product(range(1,5),repeat=9)] 

gamme (1,5) représente les 4 côtés de la filière

répétition = 9 représente les 9 dés que vous voulez rouler

Voir itertools.product pour doc

1

vous devriez regarder itertools regarder spécifiquement les combinaisons et permutations

1

la méthode la plus simple est d'utiliser le module itertools. Donc, dans votre cas particulier, nous pourrions faire:

import itertools 
itertools.combinations_with_replacement(range(1, 5), 9)) 

qui produirait un générateur. Si nous devions parcourir, nous verrions qu'il contient:

[(1, 1, 1, 1, 1, 1, 1, 1, 1), 
(1, 1, 1, 1, 1, 1, 1, 1, 2), 
(1, 1, 1, 1, 1, 1, 1, 1, 3), 
(1, 1, 1, 1, 1, 1, 1, 1, 4), 
(1, 1, 1, 1, 1, 1, 1, 2, 2), 
(1, 1, 1, 1, 1, 1, 1, 2, 3), 
... 
(3, 3, 4, 4, 4, 4, 4, 4, 4), 
(3, 4, 4, 4, 4, 4, 4, 4, 4), 
(4, 4, 4, 4, 4, 4, 4, 4, 4)] 

Si nous voulions que les sommes possibles, on pourrait facilement étendre cette via sum et set:

>>> set(sum(dice) for dice in itertools.combinations_with_replacement(range(1, 7), 9)) 
set([9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]) 

Mais nous savons aussi (via les maths!) que la plage sera l'ensemble fermé de [1*9, 4*9].