使用Dictionary来匹配密码子

时间:2016-04-16 10:55:42

标签: python

我正在尝试创建一个函数codon_pairs(pairs, codonsA, codonsB),它接受​​三个参数;字典pairs和两个列表codonsAcodonsB。字典包含碱基对,密码子列表包含密码子序列。我试图在codonsB中找到codonsA中每个密码子序列的互补密码子序列,并返回匹配对,如下所示:

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的密码子,第二项是来自codonsB的匹配密码子。例如,序列 AAG codonsA[0])和 TCC codonsB[3])是匹配对,因为A的基本对是T,并且G的基对是C,在pairs字典中突出显示。

另一方面,如果找不到匹配对,将从最终结果中省略。

这是我到目前为止所做的:

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 个答案:

答案 0 :(得分:1)

codonsB转换为set()以进行快速检查(O(1)成员资格测试,不需要嵌套循环),然后将每个密码子从A映射到pairs映射并测试结果对集合:

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()函数的列表,或者只是迭代函数。

演示:

>>> 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')]