计算文件中某个三联体的数量(DNA密码子分析)

时间:2012-09-26 20:50:31

标签: python shell bioinformatics

这个问题实际上是用于DNA密码子分析,用简单的方式来说,假设我有这样的文件:
atgaaaccaaag ...
我想计算这个文件中存在的'aaa'三元组的数量。重要的是,三元组从一开始就开始(这意味着atg,aaa,cca,aag,......)因此在这个例子中结果应该是1而不是2'aaa'。
有没有Python或Shellscript方法来做到这一点?谢谢!

4 个答案:

答案 0 :(得分:7)

首先阅读文件

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

答案 1 :(得分: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

答案 2 :(得分:1)

您可以先使用以下内容将字符串分解为三元组:

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))

答案 3 :(得分:0)

使用简单的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