假设我有:
"aabbaaa"
{'A': 'a', 'B': 'a', 'C': 'b', 'D': 'a', 'E': 'b', 'F': 'a', 'G': 'b'}
。如何在python中从占位符字符串的字典键创建所有可能的排列?
例如,预期结果将是:
[AACCAAA
,AACCAAB
,AACCABA
,... AACEAA
,AACEAA
,AAEEAA
...,FFGGFFF
等
解决方案可能是:
>>> import itertools
>>> from collections import defaultdict
>>> dict_ = defaultdict(list)
>>> input = "ab"
>>> _dict = {'A': 'a', 'B': 'a', 'C': 'b', 'D': 'a', 'E': 'b', 'F': 'a', 'G': 'b'}
>>> for k,v in _dict.items():
... dict_[v].append(k)
...
>>> _iterables = [dict_[character] for character in input]
>>> output = [''.join(tup) for tup in itertools.product(*_iterables)]
set(['BE', 'AC', 'BG', 'AE', 'AG', 'BC', 'DG', 'DE', 'DC', 'FC', 'FE', 'FG'])
让我知道是否有帮助!
您可以使用回溯构建所有排列。
起初,如果反转,则dict更有用,所以:
from collections import defaultdict
orig_str = "aabbaaa"
d = {'A': 'a', 'B': 'a', 'C': 'b', 'D': 'a', 'E': 'b', 'F': 'a', 'G': 'b'}
reverse_d = defaultdict(list)
for k, el in d.items():
reverse_d[el].append(k)
这里有reverse_d = {'a': ['A', 'B', 'D', 'F'], 'b': ['C', 'E', 'G']}
接下来,我们可以编写回溯功能,对于字符串的任何字符,将按顺序排列可能性:
def permut(orig_str, index, chars_till_now):
if index == len(orig_str):
print("".join(chars_till_now))
return
chars = chars_till_now[:]
chars.append("")
for possibility in reverse_d[orig_str[index]]:
chars[-1] = possibility
permut(orig_str, index+1, chars)
您可以修改函数以保存排列,而不是打印或传递特定的字典,而不是使用一个全局字典;这取决于您的需求。
仅调用该函数:
permut(orig_str, 0, [])