用字典键替换字符串中的占位符

时间:2020-03-06 13:00:39

标签: python permutation

假设我有:

  • 占位符字符串"aabbaaa"
  • 和字典:{'A': 'a', 'B': 'a', 'C': 'b', 'D': 'a', 'E': 'b', 'F': 'a', 'G': 'b'}

如何在python中从占位符字符串的字典键创建所有可能的排列?

例如,预期结果将是:

AACCAAAAACCAABAACCABA,... AACEAAAACEAAAAEEAA ...,FFGGFFF

2 个答案:

答案 0 :(得分:5)

解决方案可能是:

    >>> 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'])

让我知道是否有帮助!

答案 1 :(得分:0)

您可以通过回溯构建所有排列。

首先,如果将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, [])