使用多个字符的翻译生成字符串,映射到其他几个字符

时间:2018-02-21 21:31:29

标签: python

我的python代码中遇到了一个棘手的问题。我环顾四周,无法找到有类似问题的人。

我想生成一些字符串,将一些字符翻译成几个不同的字符。

我希望被替换(翻译)的原始字符替换为几个不同的字符。 我想要做的是这样的事情:

text = "hi there"
translations = {"i":["b", "c"], "r":["e","f"]}
result = magicfunctionHere(text,translations)
print(result)
> [
    "hb there",
    "hc there",
    "hi theee",
    "hi thefe",
    "hb theee",
    "hb thefe",
    "hc theee",
    "hc thefe"
]

结果包含原始文本的任意组合,'i'和'r'分别由'b'和'c','e'和'f'替换。

我不知道怎么做,使用itertools和函数,如排列,产品等......

我希望我足够清楚,这是一个非常具体的问题! 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

def magicfunction(ret, text, alphabet_location, translations):
    if len(alphabet_location) == 0:
        ret.append(text)
        return ret
    index = alphabet_location.pop()
    for w in translations[text[index]]:
        ret = magicfunction(ret, text[:index] + w + text[index + 1:], alphabet_location, translations)
    alphabet_location.append(index)
    return ret

def magicfunctionHere(text, translations):
    alphabet_location = []
    for key in translations.keys():
        alphabet_location.append(text.find(key))
        translations[key].append(key)
    ret = []
    ret = magicfunction(ret, text, alphabet_location, translations)
    ret.pop()
    return ret

text = "hi there"
translations = {"i":["b", "c"], "r":["e","f"]}
result = magicfunctionHere(text,translations)
print(result)

答案 1 :(得分:0)

一种粗略的方法是在2个步骤(功能)中使用Nested Loop Construct,如下面的代码段所示:

def rearrange_characters(str_text, dict_translations):
    tmp_result = []
    for key, value in dict_translations.items():
        if key in str_text:
            for replacer in value:
                str_temp = str_text.replace(key, replacer, 1)
                if str_temp not in tmp_result:
                    tmp_result.append(str_temp)
    return tmp_result


def get_rearranged_characters(str_text, dict_translations):
    lst_result = rearrange_characters(str_text, dict_translations)
    str_joined = ','.join(lst_result)
    for str_part in lst_result:
        str_joined = "{},{}".format(str_joined, ','.join(rearrange_characters(str_part, dict_translations)))
    return set(str_joined.split(sep=","))


text            = "hi there"
translations    = {"i": ["b", "c"], "r":["e","f"]}
result          = get_rearranged_characters(text, translations)
print(result)
## YIELDS: {
            'hb theee', 
            'hc thefe', 
            'hc there', 
            'hi thefe', 
            'hb thefe', 
            'hi theee', 
            'hc theee', 
            'hb there'
            }

enter image description here

另见:https://eval.in/960803

另一个同样令人费解的方法是使用嵌套循环的单个函数,如下所示:

def process_char_replacement(str_text, dict_translations):
    tmp_result = []
    for key, value in dict_translations.items():
        if key in str_text:
            for replacer in value:
                str_temp = str_text.replace(key, replacer, 1)
                if str_temp not in tmp_result:
                    tmp_result.append(str_temp)

    str_joined = ','.join(tmp_result)
    for str_part in tmp_result:
        tmp_result_2 = []
        for key, value in dict_translations.items():
            if key in str_part:
                for replacer in value:
                    str_temp = str_part.replace(key, replacer, 1)
                    if str_temp not in tmp_result_2:
                        tmp_result_2.append(str_temp)
        str_joined = "{},{}".format(str_joined, ','.join(tmp_result_2))
    return set(str_joined.split(sep=","))


text            = "hi there"
translations    = {"i": ["b", "c"], "r":["e","f"]}      
result          = process_char_replacement(text, translations)
print(result)
## YIELDS: {
            'hb theee', 
            'hc thefe', 
            'hc there', 
            'hi thefe', 
            'hb thefe', 
            'hi theee', 
            'hc theee', 
            'hb there'
            }

请参阅:https://eval.in/961602