114 votes

Génération de permutations avec répétitions

Je connais itertools, mais il semble qu'il ne puisse générer que des permutations sans répétitions.

Par exemple, j'aimerais générer tous les lancers 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.

Dans la mesure du possible, je ne veux pas mettre en œuvre ce système à partir de zéro.

0voto

Euler_Salter Points 657

Je pense avoir trouvé une solution en utilisant uniquement lambdas , map y reduce .

product_function = lambda n: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(n)), [])

Essentiellement, je fais correspondre une première fonction lambda qui, étant donné une ligne, itère les colonnes.

list(map(lambda j: (i, j), np.arange(n)))

puis il est utilisé comme sortie d'une nouvelle fonction lambda

lambda i:list(map(lambda j: (i, j), np.arange(n)))

qui est mappé à travers toutes les lignes possibles

map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(m))

et ensuite nous réduisons toutes les listes résultantes en une seule.

encore mieux

On peut aussi utiliser deux numéros différents.

prod= lambda n, m: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(m))), np.arange(n)), [])

-1voto

Eric_HL_DoCode Points 9

Tout d'abord, vous voudrez transformer le générateur renvoyé par itertools.permutations(list) en une liste. Ensuite, vous pouvez utiliser set() pour supprimer les doublons. Quelque chose comme ci-dessous :

def permutate(a_list):
    import itertools
    return set(list(itertools.permutations(a_list)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X