这个问题实际上是针对 DNA 密码子分析的,简单地说,假设我有一个这样的文件:
atgaaaccaaag...
我想计算这个文件中存在的“aaa”三联体的数量。重要的是,三元组从一开始就开始(这意味着 atg,aaa,cca,aag,...)所以在这个例子中结果应该是 1 而不是 2 'aaa'。
是否有任何 Python 或 Shellscript 方法可以做到这一点?谢谢!
问问题
4001 次
4 回答
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)]
然后数他们
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
于 2012-09-26T20:55:31.080 回答
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
。
于 2012-09-26T20:58:16.373 回答
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))
于 2012-09-26T20:58:32.693 回答
0
使用一个简单的外壳,假设你的 fasta 只包含一个序列。
grep -v ">" < input.fa |
tr -d '\n' |
sed 's/\([ATGCatgcNn]\{3,3\}\)/\1#/g' |
tr "#" "\n" |
awk '(length($1)==3)' |
sort |
uniq -c
于 2012-09-26T21:56:02.117 回答