【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组成列表。
测试数据
>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在某序列中出现频率组成的列表,1-mer组成列表就相当于这条序列的GC含量,2-mer,3-mer和4-mer分别又被叫作二核苷酸,三核苷酸和四核苷酸组成(di-nucleotide, tri-nucleotide, and tetra-nucleotide compositions)。K-mer在物种鉴定、编码区鉴定以及序列拼接等多种序列分析过程中扮演重要的角色。
将一条序列所有的k-mer按照字母顺序排列,其对应的出现频率也可以写成一个数组,这个数组就是这条序列的k-mer组成。
思路
我将这个问题划分为两部分依次解决。
第一部分:得到所有的4-mer,这里写一个排列函数,用循环的方法得到4-mer;
第二部分:统计4-mer出现的频率,只需扫描序列,依次与每个4-mer比较即可。
代码
def perm(l1, l2):
"""用来进行排列的函数"""
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: # 用循环的方法得到4-mer,用4-mer自身的数量控制循环
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()