Je connais les outils informatiques, mais il semble que cela ne peut générer que des permutations sans répétition.
par exemple, j'aimerais générer tous les jets de dés possibles pour 2 dés. J'ai donc besoin de toutes les permutations de taille 2 de [1, 2, 3, 4, 5, 6], y compris les répétitions: (1, 1), (1, 2), (2, 1) ... etc.
Si possible, je ne veux pas implémenter cela à partir de zéro
Vous recherchez le Produit cartésien .
En mathématiques, un produit cartésien (ou ensemble de produits) est le produit direct de deux ensembles.
Dans votre cas, ce serait {1, 2, 3, 4, 5, 6}
x {1, 2, 3, 4, 5, 6}
. itertools
peut vous aider:
import itertools
x = [1, 2, 3, 4, 5, 6]
[p for p in itertools.product(x, repeat=2)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3),
(2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6),
(4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3),
(5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
Pour obtenir un jet de dés aléatoire (de manière totalement inefficace):
import random
random.choice([p for p in itertools.product(x, repeat=2)])
(6, 3)
Vous ne recherchez pas les permutations - vous voulez le produit cartésien . Pour cette utilisation product from itertools:
from itertools import product
for roll in product([1, 2, 3, 4, 5, 6], repeat = 2):
print(roll)
En python 2.7 et 3.1, il existe une itertools.combinations_with_replacement
fonction:
>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2))
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4),
(2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6),
(5, 5), (5, 6), (6, 6)]
Tout d'abord, vous voudrez d'abord transformer le générateur renvoyé par itertools.permutations (liste). Ensuite, vous pouvez utiliser set () pour supprimer les doublons
def permutate(a_list):
import itertools
return set(list(itertools.permutations(a_list)))