所屬專題:[字符串算法](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))
```