2016-04-16 9 views
1

私は3つの引数を取る関数codon_pairs(pairs, codonsA, codonsB)を作ろうとしています。 pairsと2つのリストcodonsAcodonsBがあります。辞書は塩基対を含み、コドンリストはコドン配列を含む。私はcodonsAで各コドン配列のためにcodonsB相補コドン配列を見つけ、次のように一致するペアを返すようにしようとしています:辞書を使用してコドンを照合する

pairs = {'A':'T', 'C':'G', 'T':'A', 'G':'C'} 
codonsA = ['AAG', 'TAC', 'CGG', 'GAT', 'TTG', 'GTG', 'CAT', 'GGC', 'ATT', 'TCT'] 
codonsB = ['TAA', 'CTA', 'AAC', 'TTC', 'AGA', 'CCC', 'CCG', 'GTA'] 

print(codons_pairs(pairs, condonsA, codonsB)) 

[('AAG', 'TTC'), ('GAT', 'CTA'), ('TTG', 'AAC'), ('CAT', 'GTA'), ('GGC', 'CCG'), ('ATT', 'TAA'), ('TCT', 'AGA')] 

2タプルの最初の項目はcodonsAからコドンと2番目の項目です一致するコドンはcodonsBである。例えば、Aの塩基対はTであり、Gの塩基対はCであり、pairs辞書でハイライト表示されているので、配列AAGcodonsA[0])およびTCCcodonsB[3])は、対の対である。

一致するペアが見つからない場合は、最終結果から省略されます。

これは私がこれまで持っているものです。

pairs = {'A':'T', 'C':'G', 'T':'A', 'G':'C'} 
codonsA = ['AAG', 'TAC', 'CGG', 'GAT', 'TTG', 'GTG', 'CAT', 'GGC', 'ATT', 'TCT'] 
codonsB = ['TAA', 'CTA', 'AAC', 'TTC', 'AGA', 'CCC', 'CCG', 'GTA'] 

def codons_pairs(pairs, codonsA, codonsB): 

    for A in codonsA: 
     for B in codonsB: 
      for i in A: 
       for j in B: 

私はちょうど辞書に関して、codonsAcodonsBの間でペアをチェックするかどうかはわかりません。どんな助けでも大歓迎です。

答えて

1

速いチェック(O(1)メンバーシップのテスト、ネストされたループの必要はありません)、その後、あなたのpairsマッピングによってAから各コドンをマッピングするためにset()codonsBを変換し、セットに対して結果をテスト:

def codons_pair(pairs, codonsA, codonsB): 
    codonsB = set(codonsB) 
    for codon in codonsA: 
     complement = ''.join([pairs[base] for base in codon]) 
     if complement in codonsB: 
      yield (codon, complement) 

上記はジェネレータ関数です。それが見つけられるごとに各試合が行われます。生成されたジェネレータをlist()関数を持つリストに変換するか、関数を反復するだけです。

デモ:答え@Martijnピータースのための

>>> pairs = {'A':'T', 'C':'G', 'T':'A', 'G':'C'} 
>>> codonsA = ['AAG', 'TAC', 'CGG', 'GAT', 'TTG', 'GTG', 'CAT', 'GGC', 'ATT', 'TCT'] 
>>> codonsB = ['TAA', 'CTA', 'AAC', 'TTC', 'AGA', 'CCC', 'CCG', 'GTA'] 
>>> list(codons_pair(pairs, codonsA, codonsB)) 
[('AAG', 'TTC'), ('GAT', 'CTA'), ('TTG', 'AAC'), ('CAT', 'GTA'), ('GGC', 'CCG'), ('ATT', 'TAA'), ('TCT', 'AGA')] 
+0

おかげで:)私は降伏を使用する必要はありません方法はありますか? – RoadRunner

+1

関数の先頭にリストを作成し、yieldを使用するのではなく、リストに追加して最後にリストを返します。 –

+0

ええ、ありがとう、これは素晴らしい答えです。私は完全にset()メソッドの使用を忘れていました。 – RoadRunner

関連する問題