所属专题:[字符串算法](README.md)
 
## 问题
DNA序列的GC含量,是序列包含的'C'或'G'碱基的百分比(一般省略百分号,范围0~100)。例如,序列"AGCTATAG"的GC含量为37.5%(或写作37.5)。请注意,任何DNA序列的反向互补序列之间有着同一个GC含量。
DNA序列在归入数据库中时需要做标记。序列标记的常用方法是使用FASTA格式。在该格式中,序列信息开始于以'>'开头连接着的一行注释信息(ID);随后的若干行是序列本身。
**输入:** 遵循FASTA格式的至多10条DNA序列(每条序列最长为1 kb)。
**输出:** GC含量最高的序列ID,下一行是该序列的GC含量值。
**样例数据:**
```
>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT
```
**样例输出:**
```
Rosalind_0808
60.919540
```
 
## 背景知识
该问题涉及DNA序列的GC含量计算,以及对生物信息学常用数据格式FASTA格式的认识。详情请查阅ROSALIND网站上[关于该问题的背景说明](http://rosalind.info/problems/gc/)。
 
## 解答
```
def read_fa(fa):
"""读入FASTA格式的文件对象fa,将其中的序列用字典结构存储"""
seq = {}
for line in fa:
if line.startswith('>'):
seqid = line.replace('>', '').split()[0]
seq[seqid] = ''
else:
seq[seqid] += line.strip()
return seq
def gc_content(s):
"""读入DNA序列s,计算s中的GC含量"""
gcc = (s.count('C')+s.count('G'))/len(s)*100
return gcc
## --main--
with open("rosalind_gc.txt", 'r') as f1:
dna_seq = read_fa(f1)
dna_gc = {i:gc_content(j) for i,j in dna_seq.items()}
maxgc_value = max(dna_gc.values())
maxgc_id = []
for id,gcvalue in dna_gc.items():
if gcvalue==maxgc_value:
maxgc_id.append(id)
with open("rosalind_gc_out.txt", 'w') as f2:
f2.write(','.join(maxgc_id) + "\n")
f2.write(str(maxgc_value))
```