2012-02-23 6 views
1

詳細については、EDITにジャンプしてください。複数のキーを持つ値のすべてのインスタンスをカウントするPython

私はこの問題を数時間解決しようとしましたが、私の頭は痛いです(特に私はすでに以前にそれを解決していましたが、私のソリューションを使用するスクリプトは学校のコンピュータ)。

これは私の問題です。 A's、T's、G's、C's(DNAでもいい)の配列で、私はすべてのアミノ酸を見つけなければならず、どれくらいのアミノ酸があるかを数えなければならない。素人の言葉で言えば、これはこれに当てはまります。

特定のパターン(コドンとも呼ばれる)のために配列を検索する必要があります。これは、Aおよび/またはTおよび/またはGおよび/またはCの3文字の長い配列です。各アミノ酸には少なくとも1つのコドンが付いています。私の仕事は、各アミノ酸の発生量を数えることです。

第2のtableには、アミノ酸が左側に、関連するコドンが右側に表示されます。

私はそうのような設定の辞書を持っている:

aaDic = {'ttt': 'F', 'tct': 'S', 'tat': 'Y', 'tgt': 'C', 
    'ttc': 'F', 'tcc': 'S', 'tac': 'Y', 'tgc': 'C', 
    'tta': 'L', 'tca': 'S', 'taa': '*', 'tga': '*', 
    'ttg': 'L', 'tcg': 'S', 'tag': '*', 'tgg': 'W', 
    'ctt': 'L', 'cct': 'P', 'cat': 'H', 'cgt': 'R', 
    'ctc': 'L', 'ccc': 'P', 'cac': 'H', 'cgc': 'R', 
    'cta': 'L', 'cca': 'P', 'caa': 'Q', 'cga': 'R', 
    'ctg': 'L', 'ccg': 'P', 'cag': 'Q', 'cgg': 'R', 
    'att': 'I', 'act': 'T', 'aat': 'N', 'agt': 'S', 
    'atc': 'I', 'acc': 'T', 'aac': 'N', 'agc': 'S', 
    'ata': 'I', 'aca': 'T', 'aaa': 'K', 'aga': 'R', 
    'atg': 'M', 'acg': 'T', 'aag': 'K', 'agg': 'R', 
    'gtt': 'V', 'gct': 'A', 'gat': 'D', 'ggt': 'G', 
    'gtc': 'V', 'gcc': 'A', 'gac': 'D', 'ggc': 'G', 
    'gta': 'V', 'gca': 'A', 'gaa': 'E', 'gga': 'G', 
    'gtg': 'V', 'gcg': 'A', 'gag': 'E', 'ggg': 'G' 
    } 

私はもちろん、各コドンの出現箇所の量をカウントすることができますが、各アミノ酸に関連した複数のコドンがありますので、私は本当にの合計を必要とします特異的コドン。

for codons in aaDic: 
    s.count(codons) 

(上記のコードでは、sは、a、t、c、gのシーケンスです)。例えば、

tta、ttg、ctt、ctc、cta、ctgは全てアミノ酸 'L'に関連しているので、tta、ttg、ctt、ctc、cta、ctgのすべての事象を合計する必要があります。アミノ酸「L」の総発生量を得る。

私は十分明確であることを願っています。特に説明するのは少し難しいです。特に、あなた自身のために長い間それをやろうとした後で、失敗してしまいました(少なくともあなたが何をしているのか分かりません。それは私の場合です:D)

EDIT:

私は自分自身がもう少し明確にしてみましょう:

  1. 我々はexlusively文字A、Tからなる配列を与えられています、CそしてG.
  2. このシーケンスを3つずつ解析する必要があります。 TTCは以下のとおりです。

    は、我々は今、辞書にこれらのキーを検索し、我々は関連するアミノ酸を見つける「CTC」

  3. 、私たちは「TTC」、「TTA」を取得 配列「はTTCTTACTC」であると仮定しますF TTAはL です。CTCはL
  4. です。辞書にF、L、その他の値(FLIMVSPTAY * HQNKDECWRSG)の数を数えて格納する必要があります。
所望の出力はそうのような辞書のようになります。

{L:total no. of the amino acid 'L' in the sequence, S:total no. of the amino acid 'S' in the sequence, ...} 
+1

は、それから、 '.count'を使用して注意してくださいコドン境界を尊重しない。あなたがおそらく0を望むときに '' aacgag'.count( 'cga')== 1 'となります。 – DSM

+0

DNA配列は3つずつ解析されるべきですか? –

+0

この宿題はありますか? – senderle

答えて

2

あなたは上記のPython 2.7以上を使用する場合は、アミノ酸をカウントするcollections.Counterを使用することができます。まず、コドンにあなたの塩基配列を分割し、各コドンに対応するアミノ酸をカウント:ジェネレータ式(aaDict[c] for c in codons)にかかわらず、それらが符号化されたコドンによって、アミノ酸の配列を生成すること

base_seq = "atcgtgagt" 
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)] 
amino_acid_counts = collections.Counter(aaDict[c] for c in codons) 

注意。

あなたは、Pythonの以前のバージョンを使用している場合、あなたはまた、カウントのために、プレーンの辞書を使用することができます。

amino_acid_counts = dict.fromkeys(aaDict.values(), 0) 
for c in codons: 
    amino_acid_counts[aaDict[c]] += 1 
+0

これは 'コドン'が '['atc'、 'gtg'、 'agt']'になってしまいます。 –

1

あなたは2.7以降を持っていない場合、あなたはまだdefaultdictを使用することができます。

counts = collections.defaultdict(int) 
for k in aaDic: 
    counts[aaDic[k]] += 1 
+0

ちょうどそれを試みたが、これは私が探しているものではありません。これは、与えられた辞書に特定の値がどれほど頻繁に現れるかを数えます。私が必要とするものは何か他のものです。私は自分の投稿を編集し、よりよく説明しようとします。 –

1

次のことを試してみてください。

y = {} 
for x in aaDic.items(): 
    y[x[1]] = [] 
for x in aaDic.items(): 
    y[x[1]].append(x[0]) 

その後、あなたはXキーですべての値を見つけることができます:

xkv = [ k for k in y.keys() if len(y[k]) == X ] 
1

コドンを使用しスヴェン-marnach @から分割:

base_seq = "atcgtgagt" 

# split sequence, 3 by 3 
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)] 

# for each codon we have, obtain his associated amino_acid from aaDic 
amino_acids = map(aaDic.get, base_seq) 
# here, amino_acids is ['I', 'V', 'S'] 

i_count = amino_acids.count('I') 
# and so on 

その後、あなたとあなたの結果の辞書を組み立てることができます。

aa_names = set(aaDic.values()) 
return dict((aa_name, amino_acids.count(aa_name) for aa_name in aa_names)) 
関連する問題