我的替换列表采用以下格式。
lstrep = [('A',('aa','aA','Aa','AA')),('I',('ii','iI','Ii','II')),.....]
我想要达到的目的是通过所有可能的替换来改变字母的出现。输入词也应该是列表的成员。 e.g。
输入 - DArA
预期产出 -
['DArA','DaarA','Daaraa','DAraa','DaArA','DAraA','DaAraA','DAarA','DAarAa', 'DArAa','DAArA','DAArAA','DArAA']
我的尝试是
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)
我收到的输出是['DArA', 'Daaraa', 'DaAraA', 'DAarAa', 'DAArAA']
,即所有出现的'A'分别被'aa','aA','Aa'和'AA'取代。我想要的是它应该给出可选替换的所有排列。
答案 0 :(得分:3)
itertools.product
将提供所有排列。您可以建立一个替换列表,然后让它处理排列。
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)
答案 1 :(得分:0)
尝试根据出现的可替换字符构造所有可能排列的元组。 这必须使用递归来实现。
递归是必要的原因是你需要一个可变数量的循环来实现这一点。
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))
您认为需要两个循环用于两个可替换项,而{strong> n
循环用于n
个可替换项。
想想一种可以使用递归来解决这个问题的方法。它可能涉及为包含n-1
个可替换项的子字符串创建所有排列(如果原始字符串中有n
)。