首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写字符串算法

如何编写字符串算法
EN

Stack Overflow用户
提问于 2019-05-30 23:39:59
回答 3查看 152关注 0票数 0

给定一个FASTA文本文件(Rosalind_gc.txt),我应该检查每个DNA记录并确定鸟嘌呤胞嘧啶(GC)含量的百分比(%)。

这方面的示例如下:

样本数据集:

代码语言:javascript
复制
>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG    
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT

示例输出:

Rosalind_0808 60.919540

所以基本上遍历每个字符串,计算G/C出现的时间的amt,然后将总数除以每个字符串的长度。我的问题是学习如何识别代码中的中断(即>Rosalind_6404 )。我想要一个不使用Biopython的代码示例,也可以使用biopython方法。

EN

回答 3

Stack Overflow用户

发布于 2019-05-31 05:33:04

您可以逐行读取文件,并将序列数据累积到以">“开头的下一行(文件末尾再加一次)

代码语言:javascript
复制
def getCount(seq):
    return seq.count("G")+seq.count("C") 

with open("input.txt","r") as file:
    sequence = ""
    name     = ""
    for line in file:
        line = line.strip()
        if not line.startswith(">"):
            sequence += line
            continue
        if name != "":
            print(name, 100*getCount(sequence)/len(sequence))
        name     = line[1:]
        sequence = ""
    print(name, 100*getCount(sequence)/len(sequence))

# Rosalind_6404 53.75
# Rosalind_5959 53.57142857142857
# Rosalind_0808 60.91954022988506
票数 2
EN

Stack Overflow用户

发布于 2019-05-31 19:45:07

既然您正在寻找一个Biopython解决方案,下面是一个非常简单的解决方案:

代码语言:javascript
复制
from Bio import SeqIO
from Bio.SeqUtils import GC

for r in SeqIO.parse('Rosalind_gc.fa', 'fasta'):
    print(r.id, GC(r.seq))

输出:

代码语言:javascript
复制
Rosalind_6404 53.75
Rosalind_5959 53.57142857142857
Rosalind_0808 60.91954022988506
票数 2
EN

Stack Overflow用户

发布于 2019-05-31 05:35:26

您可能希望尽可能多地使用预编译的C模块来解决性能问题。有一个使用正则表达式的解决方案:

代码语言:javascript
复制
seq = 'CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG'

import re
perc = re.subn(r'[GC]', '', seq) / len(seq)

还可以处理">“行:

代码语言:javascript
复制
seq = []
name = ''

for line in open('Rosalind_gc.txt'):
    if not line.startswith('>'):
        seq.append(line.strip())
    else:
        if seq:
            seq = ''.join(seq)
            perc = re.subn(r'[GC]', '', seq) / len(seq)
            print('{} has GC percent: {}'.format(name, perc * 100))
            seq = []
        name = line.strip()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56381396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档