Itertools para generar combinaciones revueltos.

Lo que quiero hacer es obtener todas las combinaciones y todas las permutaciones únicas de cada combinación. Las combinaciones con función de reemplazo solo me llevan hasta ahora:

from itertools import combinations_with_replacement as cwr foo = list(cwr('ACGT', n)) ## n is an integer 

Mi intuición sobre cómo avanzar es hacer algo como esto:

 import numpy as np from itertools import permutations as perm bar = [] for x in foo: carp = list(perm(x)) for i in range(len(carp)): for j in range(i+1,len(carp)): if carp[i] == carp[j]: carp[j] = '' carp = carp[list(np.where(np.array(carp) != '')[0])] for y in carp: bar.append(y) for i in range(len(bar)): for j in range(i+1,len(bar)): if bar[i] == bar[j]: bar[j] = '' bar = [bar[x2] for x2 in list(np.where(np.array(bar) != '')[0])] 

¿Hay un algoritmo más eficiente?

Parece que estás pensando en una especie de “permutaciones con reemplazo”, donde una entrada de 'AB' con un tamaño de permutación de 2 daría las salidas

 AA AB BA BB 

Si es así, ese es el producto cartesiano de la entrada consigo mismo n veces. Usted quiere itertools.product :

 >>> import itertools >>> list(itertools.product('AB', repeat=2)) [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]