这个问题实际上是DNA密码分析,把它放在一个简单的方法,让我们说我有一个这样的文件:
atgaaaccaaag ...
我想点算在这个文件“AAA”三件套的数量。 重要的是,三胞胎从一开始启动(这意味着ATG,AAA,CCA,AAG,...)所以结果应该是1,而不是在这个例子2“AAA”。
是否有任何Python或shell脚本的方法来做到这一点? 谢谢!
Answer 1:
首先看书的文件
with open("some.txt") as f:
file_data = f.read()
然后将其分成3点的
codons = [file_data[i:i+3] for i in range(0,len(file_data),3)]
再算上EM
print codons.count('aaa')
像这样
>>> my_codons = 'atgaaaccaaag'
>>> codons = [my_codons[i:i+3] for i in range(0,len(my_codons),3)]
>>> codons
['atg', 'aaa', 'cca', 'aag']
>>> codons.count('aaa')
1
Answer 2:
显而易见的解决方案是将字符串分割成3个字符的片,然后计数“AAA”的出现次数:
s = 'atgaaaccaaag'
>>> [s[i : i + 3] for i in xrange(0, len(s), 3)].count('aaa')
1
如果字符串是很长的,那么这个解决会咀嚼了一些不必要的内存创建子列表。
s = 'atgaaaccaaag'
>>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
1
>>> s = 'aaatttaaacaaagg'
>>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
2
这使用生成的表达,而不是创建一个临时列表,所以这将是更多的内存效率。 它需要的事实优势, True == 1
,即True + True == 2
。
Answer 3:
你可以先打破字符串转换成三元组,采用类似:
def split_by_size(input, length):
return [input[i:i+length] for i in range(0, len(input), length)]
tripleList = split_by_size(input, length)
然后检查“AAA”,并概括:
print sum(filter(lambda x: x == "aaa", tripleList))
Answer 4:
用一个简单的shell,假设你的FASTA只包含一个序列。
grep -v ">" < input.fa |
tr -d '\n' |
sed 's/\([ATGCatgcNn]\{3,3\}\)/\1#/g' |
tr "#" "\n" |
awk '(length($1)==3)' |
sort |
uniq -c
文章来源: count the number of a certain triplet in a file (DNA codon analysis)