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

问题描述 投票:0回答:2

假设我有:

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

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

例如,预期结果将是:

[AACCAAAAACCAABAACCABA,... AACEAAAACEAAAAEEAA ...,FFGGFFF

python permutation
2个回答
4
投票

解决方案可能是:

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

让我知道是否有帮助!


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, [])
© www.soinside.com 2019 - 2024. All rights reserved.