# 引入正则表达式模块
import re
def gen_cf(m, n):
"""该函数是用来计算 m序列尾部和 n序列头部重叠碱基个数
"""
max_gen = 0
for j in range(len(m), 3, -1):
if m[-j:] == n[0:j]:
max_gen = j
return max_gen
def order(m, n):
"""该函数通过调用gen_cf函数,来判断 m序列尾部和n序列头部连接 还是
n序列尾部和 m序列头部连接,最后返回一个列表。列表包含序列之间连接的信息
还有重叠碱基数
"""
order_1 = gen_cf(m, n)
order_2 = gen_cf(n, m)
if order_1 > order_2:
return [1, order_1]
else:
return [2, order_2]
def add(m, n):
"""
该函数通过调用order函数,将m n 连接起来
"""
j = order(m, n)
if j[0] == 1:
return m + n[j[1]:]
else:
return n + m[j[1]:]
# 打开TXT文件,读取信息并将序列存为列表 substring_list
with open('G:/PycharmProjects/pythonProject1/hi/information/files/rosalind_long.txt') as ds:
s = ''
for i in ds:
s += i.strip()
substring_list = [i for i in re.findall(r'[TACG]+', s)]
gen_begin = substring_list.pop(0)
# 后面我的想法就是不断拿序列gen_begin连接其他序列(并且删除),用while循环控制,直到列表 substring_list 为空
while substring_list:
l = []
for i in substring_list:
l.append(order(gen_begin, i)[1])
print(l) # l序列 是gen_begin和其他序列的最大重叠数(顺逆两种连接的办法)
max_index = l.index(max(l))
n = substring_list.pop(max_index) #从列表 substring_list中 删除与gen_begin重叠碱基数 最多的序列
gen_begin = add(gen_begin, n) # 合成成为新的gen_begin
print(gen_begin)
print(substring_list)
题目来源与生信练习网站 http://rosalind.info/problems/long/
做题过程中有些地方想法不对,学习了 https://www.bilibili.com/read/cv4332120的答案,并重新解答