web-dev-qa-db-fra.com

générer des permutations avec des répétitions en python

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

57
Bwmat

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)
92
miku

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)
22
Mark Byers

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)]
4
SilentGhost

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)))
0
Eric_HL_DoCode