计数在文件中的某些三元组的数量(DNA密码子分析)(count the number of a ce

2019-09-23 02:13发布

这个问题实际上是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)