2

この質問は、実際にはDNAコドン分析のためのものです。簡単に言うと、次のようなファイルがあるとします
。atgaaaccaaag...
そしてこのファイルに存在する「aaa」トリプレットの数を数えたいと思います。重要なことに、トリプレットは最初から始まります(つまり、atg、aaa、cca、aag、...)。したがって、この例では、結果は2'aaa'ではなく1になります。
これを行うためのPythonまたはシェルスクリプトのメソッドはありますか?ありがとう!

4

4 に答える 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)]

次に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
于 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 に 1 つのシーケンスしか含まれていないと仮定して、単純なシェルを使用します。

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 に答える