Genome Assembly as Shortest Superstring

# 引入正则表达式模块
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的答案,并重新解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值