Opcionalmente reemplazando una subcadena de python.

Mi lista de reemplazo está en el siguiente formato.

lstrep = [('A',('aa','aA','Aa','AA')),('I',('ii','iI','Ii','II')),.....] 

Lo que quiero lograr es, opcionalmente, cambiar la aparición de la letra por todos los reemplazos posibles. La palabra de entrada también debe ser un miembro de la lista. p.ej

entrada – DArA

Rendimiento esperado –

 ['DArA','DaarA','Daaraa','DAraa','DaArA','DAraA','DaAraA','DAarA','DAarAa', 'DArAa','DAArA','DAArAA','DArAA'] 

Mi bash fue

 lstrep = [('A',('aa','aA','Aa','AA'))] def alte(word,lstrep): output = [word] for (a,b) in lstrep: for bb in b: output.append(word.replace(a,bb)) return output print alte('DArA',lstrep) 

La salida que recibí fue ['DArA', 'Daaraa', 'DaAraA', 'DAarAa', 'DAArAA'] es decir, todas las apariciones de ‘A’ fueron reemplazadas por ‘aa’, ‘aA’, ‘Aa’ y ‘AA ‘respectivamente. Lo que quiero es que debe dar todas las permutaciones de reemplazos opcionales.

itertools.product dará todas las permutaciones. Puede crear una lista de sustituciones y luego dejar que maneje las permutaciones.

 import itertools lstrep = [('A',('aa','aA','Aa','AA')),('I',('ii','iI','Ii','II'))] input_str = 'DArA' # make substitution list a dict for easy lookup lstrep_map = dict(lstrep) # a substitution is an index plus a string to substitute. build # list of subs [[(index1, sub1), (index1, sub2)], ...] for all # characters in lstrep_map. subs = [] for i, c in enumerate(input_str): if c in lstrep_map: subs.append([(i, sub) for sub in lstrep_map[c]]) # build output by applying each sub recorded out = [input_str] for sub in itertools.product(*subs): # make input a list for easy substitution input_list = list(input_str) for i, cc in sub: input_list[i] = cc out.append(''.join(input_list)) print(out) 

Intente construir las tuplas de todas las permutaciones posibles en función de los caracteres reemplazables que se producen. Esto deberá lograrse mediante la recursión .

La razón por la que es necesaria la recursión es que necesitaría un número variable de bucles para lograrlo.

Para su ejemplo “DArA” (2 caracteres reemplazables, “A” y “A”):

 replaceSet = set() replacements = ['A':('aa','aA','Aa','AA'),'I':('ii','iI','Ii','II'),.....] for replacement1 in replacements["A"]: for replacement2 in replacements["A"]: replaceSet.add((replacement1, replacement2)) 

Usted ve que necesita dos bucles para dos reemplazables, y n bucles para n reemplazables .


Piense en una forma en que podría usar la recursión para resolver este problema. Es probable que implique la creación de todas las permutaciones para una subcadena que contenga n-1 reemplazables (si tenía n en su cadena original).