如何编写字符串算法

2024-04-28 16:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:

示例数据集:

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

样本输出:

罗莎琳德0808 60.919540美元

所以基本上遍历每个字符串,计算G/C出现的次数,然后除以每个字符串的长度。我的问题是学习如何识别代码中的中断(即>;Rosalind_)。我想要一个不使用Biopython和Biopython方法的代码示例。你知道吗


Tags: 文件字符串代码txt示例记录gcfasta
3条回答

既然你在寻找生物粒子解决方案,这里有一个非常简单的解决方案:

from Bio import SeqIO
from Bio.SeqUtils import GC

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

输出:

Rosalind_6404 53.75
Rosalind_5959 53.57142857142857
Rosalind_0808 60.91954022988506

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

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

为了解决性能问题,您可能希望尽可能多地使用预编译的C模块。使用regex有一个解决方案:

seq = 'CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG'

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

并处理“>;”行:

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()

相关问题 更多 >