Rosalind第五题:计算GC内容

这篇博客介绍了如何计算DNA字符串的GC含量,并展示了如何处理FASTA格式的DNA序列。给出了一个Python解决方案,该方案首先解析FASTA格式的输入,然后计算每个序列的GC含量,最后找出GC含量最高的序列及其百分比。示例数据集包含三个DNA字符串,最高GC含量的ID和其含量被输出。
摘要由CSDN通过智能技术生成

问题

DNA字符串的GC含量由字符串中“ C”或“ G”的符号百分比给出。例如,“ AGCTATAG”的GC含量为37.5%。请注意,任何DNA字符串的反向互补序列都具有相同的GC含量。

将DNA字符串整合到数据库中时,必须对其进行标记。常用的字符串标记方法称为FASTA格式。以这种格式,该字符串由以'>'开头的行引入,后跟一些标签信息。随后的行包含字符串本身;以'>'开头的第一行表示下一个字符串的标签。

在Rosalind的实现中,FASTA格式的字符串将用ID“ Rosalind_xxxx”标记,其中“ xxxx”表示介于0000和9999之间的四位数代码。

给定:最多10个FASTA格式的DNA字符串(每个长度最多1 kbp)。

返回值:具有最高GC含量的字符串的ID,后跟该字符串的GC含量。除非另有说明,否则Rosalind允许所有十进制答案中的默认误差为0.001;请参阅下面有关绝对错误的说明。

样本数据集

> Rosalind_6404 
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC 
TCCCACTAATAATTCTGAGG 
> Rosalind_5959 
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT 
ATATCCATTTGTCAGCAGACACGC 
> Rosalind_0808 
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC 
TGGGAACCTGCGGGCAGTAGGTGGAAT

Sample Output

Rosalind_0808
60.919540

python解决方案 

def parse_fasta(s):
    results = {}
    strings = s.strip().split('>')
    # Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串

    for s in strings:
        if len(s) == 0:
            continue
            # 如果字符串长度为0,就跳出循环。

        parts = s.split()
        label = parts[0]
        bases = ''.join(parts[1:])

        results[label] = bases

    return results


def gc_content(s):
    n = len(s)
    m = 0

    for c in s:
        if c == 'G' or c == 'C':
            m += 1

    return 100 * (float(m) / n)


if __name__ == "__main__":

    small_dataset = """
    >Rosalind_6404
    CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
    TCCCACTAATAATTCTGAGG
    >Rosalind_5959
    CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
    ATATCCATTTGTCAGCAGACACGC
    >Rosalind_0808
    CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
    TGGGAACCTGCGGGCAGTAGGTGGAAT
    """

    # large_dataset = open('datasets/rosalind_gc.txt').read()

    results = parse_fasta(small_dataset)
    results = dict([(k, gc_content(v)) for k, v in results.items()])
    # 这里iteritem()和item()功能是一样的
    # 前一个results输出,名称+序列,后一个results输出,名称+百分比

    highest_k = None
    highest_v = 0

    for k, v in results.items():
        if v > highest_v:
            highest_k = k
            highest_v = v
            # 输出GC含量高的
    print(highest_k)
    print('%f%%' % highest_v)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值