寻找字符串序列中三元组的备选方案

Finding Alternative for Triplets in a String Sequence

字符串序列有两种: 1 - 主字符串:无论长度如何,都可以分成一组完整的三元组。该序列带有一个字典,其中包含不同三元组的键和表示为字符串的数字值。相同值的三元组互为替代

alternatives = {"atr": "1", "atx": "1",
                "erf": "2", "erg": "2", "erl": "2",
                "ghe": "3", "gaz": "3",
                "bnv": "4", "bnn": "4"}

main = "atrerfghebnv"

2 - user_input 字符串:比主字符串短,不一定以三元组的形式出现。

user_input = "fgheb"

任务:

1 - 查看 user_input 是否是主序列的子串。

2 - 如果是这样,我们需要找出它与哪些三胞胎对齐。在此示例中,它与三个三元组对齐:

main       = atr erf ghe bnv
user_input =       f ghe b

3 - 对于 user_input 对齐的任何三元组,我们应该将其替换为其中一个替代项(有些有多个替代项),然后 return 修改后的主字符串。在这个例子中它应该是这样的:

modified_main = "atrerggazbnn"
or
modified_main = "atrerlgazbnn"

有两种可能,因为'erf'有两种选择。不需要找到所有可能的形式。一个就够了。但是我已经为此工作了几天,但我无处可去。有什么建议吗?

我自己想出来的!

1 - 制作主序列的三重组

2 - 检测 user_input 与

对齐的集合

3 - 在字典中查找这些集合的备选方案

4 - 将新集添加到列表并删除旧集

5 - 加入集合以重建新的主序列

from random import choice
alternatives = {"atr": "1", "atx": "1",
            "erf": "2", "erg": "2", "erl": "2",
            "ghe": "3", "gaz": "3",
            "bnv": "4", "bnn": "4"}

main = "atrerfghebnv"
user_input = "fgheb"

start = main.find(user_input)
length = len(user_input) - 1
main_triplet = [main[i: i + 3] for i in range(0, len(main), 3)]
align_pairs = [x for x in range(start, start + length + 1)]  

pairs = []

for nuc in align_pairs:
    y = nuc / 3
    if y.is_integer() == True:
        pairs.append(int(y - 1))

    else:
        pairs.append(int(y))

pairs = list(set(pairs)) 

for pair in pairs:
    triplet = main_triplet[pair]
    value = alternatives[triplet]
    other_codons = [k for k, v in alternatives.items() if v == value and k != triplet]
final_codon = choice(other_codons)
main_triplet.insert(pair, final_codon)
main_triplet.pop(pair + 1)
    
final = "".join(main_triplet)
print(final)