【ROSALIND】【練Python,學生信】36 k-mer組成列表

如果第一次閱讀本系列文檔請先移步閱讀【ROSALIND】【練Python,學生信】00 寫在前面 ?謝謝配合~

題目:
k-Mer組成(k-Mer Composition)
Given: A DNA string s in FASTA format (having length at most 100 kbp).
所給:長度不超過100kb的一條DNA序列s,以FASTA給出。
Return: The 4-mer composition of s.
需得:s的4-mer組成列表。
?
測試數(shù)據(jù)
>Rosalind_6431
CTTCGAAAGTTTGGGCCGAGTCTTACAGTCGGTCTTGAAGCAAAGTAACGAACTCCACGG
CCCTGACTACCGAACCAGTTGTGAGTACTCAACTGGGTGAGAGTGCAGTCCCTATTGAGT
TTCCGAGACTCACCGGGATTTTCGATCCAGCCTCAGTCCAGTCTTGTGGCCAACTCACCA
AATGACGTTGGAATATCCCTGTCTAGCTCACGCAGTACTTAGTAAGAGGTCGCTGCAGCG
GGGCAAGGAGATCGGAAAATGTGCTCTATATGCGACTAAAGCTCCTAACTTACACGTAGA
CTTGCCCGTGTTAAAAACTCGGCTCACATGCTGTCTGCGGCTGGCTGTATACAGTATCTA
CCTAATACCCTTCAGTTCGCCGCACAAAAGCTGGGAGTTACCGCGGAAATCACAG
測試輸出
4 1 4 3 0 1 1 5 1 3 1 2 2 1 2 0 1 1 3 1 2 1 3 1 1 1 1 2 2 5 1 3 0 2 2 1 1 1 1 3 1 0 0 1 5 5 1 5 0 2 0 2 1 2 1 1 1 2 0 1 0 0 1 1 3 2 1 0 3 2 3 0 0 2 0 8 0 0 1 0 2 1 3 0 0 0 1 4 3 2 1 1 3 1 2 1 3 1 2 1 2 1 1 1 2 3 2 1 1 0 1 1 3 2 1 2 6 2 1 1 1 2 3 3 3 2 3 0 3 2 1 1 0 0 1 4 3 0 1 5 0 2 0 1 2 1 3 0 1 2 2 1 1 0 3 0 0 4 5 0 3 0 2 1 1 3 0 3 2 2 1 1 0 2 1 0 2 2 1 2 0 2 2 5 2 2 1 1 2 1 2 2 2 2 1 1 3 4 0 2 1 1 0 1 2 2 1 1 1 5 2 0 3 2 1 1 2 2 3 0 3 0 1 3 1 2 3 0 2 1 2 2 1 2 3 0 1 2 3 1 1 3 1 0 1 1 3 0 2 1 2 2 0 2 1 1
?
生物學背景
????????有關k-mer的介紹請參考23 按字母順序排列的K-mer。k-mer組成(k-Mer Composition)是指每個k-mer在某序列中出現(xiàn)頻率組成的列表,1-mer組成列表就相當于這條序列的GC含量,2-mer,3-mer和4-mer分別又被叫作二核苷酸,三核苷酸和四核苷酸組成(di-nucleotide, tri-nucleotide, and tetra-nucleotide compositions)。K-mer在物種鑒定、編碼區(qū)鑒定以及序列拼接等多種序列分析過程中扮演重要的角色。
????????將一條序列所有的k-mer按照字母順序排列,其對應的出現(xiàn)頻率也可以寫成一個數(shù)組,這個數(shù)組就是這條序列的k-mer組成。
?
思路
????????我將這個問題劃分為兩部分依次解決。
????????第一部分:得到所有的4-mer,這里寫一個排列函數(shù),用循環(huán)的方法得到4-mer;
????????第二部分:統(tǒng)計4-mer出現(xiàn)的頻率,只需掃描序列,依次與每個4-mer比較即可。
?
代碼
def perm(l1, l2):
??? """用來進行排列的函數(shù)"""
??? i = 0
??? p = []
??? while i < len(l1):
??????? j = 0
??????? while j < len(l2):
??????????? temp = l1[i] + l2[j]
??????????? p.append(temp)
??????????? j += 1
??????? i += 1
??? return p
f = open('input.txt', 'r')
input = f.readlines()
f.close()
index = input[0].replace('\n', '')
input = input[1:]
i = 0
seq = ''
while i < len(input):
??? seq = seq + input[i].replace('\n', '')
??? i += 1
symbol = ["A", "C", "G", "T"]
fourmers = symbol
i = 1
while len(fourmers) < 4 ** 4: # 用循環(huán)的方法得到4-mer,用4-mer自身的數(shù)量控制循環(huán)
??? fourmers = perm(symbol,fourmers)
count = [0] * len(fourmers) # count存儲4-mer組成
i = 0
while i < len(seq):
??? temp = seq[i:i+4] # 逐個掃描序列
??? j = 0
??? while j < len(fourmers):
??????? if temp == fourmers[j]: # 與4-mer比較
??????????? count[j] += 1
??????????? break
??????? j += 1
??? i += 1
i = 0
f = open('output.txt', 'a')
while i < len(count):
??? # print(str(count[i]), end=' ')
??? f.write(str(count[i]) + ' ')
??? i += 1
f.close()