寻找字符串序列中三元组的备选方案
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)
字符串序列有两种: 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)