问题
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)