计算给定序列的所有可能组合(在Python中)

gko*_*oul 1 python combinations combinatorics biopython python-3.x

我有以下字典,其中包含每个氨基酸(键|字母)所有可能的密码子(值|三联体)。这本字典在生物信息学中也被称为“DNA密码子表”。

codon_table = {
'A': ('GCT', 'GCC', 'GCA', 'GCG'),
'C': ('TGT', 'TGC'),
'D': ('GAT', 'GAC'),
'E': ('GAA', 'GAG'),
'F': ('TTT', 'TTC'),
'G': ('GGT', 'GGC', 'GGA', 'GGG'),
'H': ('CAT', 'CAC'),
'I': ('ATT', 'ATC', 'ATA'),
'K': ('AAA', 'AAG'),
'L': ('TTA', 'TTG', 'CTT', 'CTC', 'CTA', 'CTG'),
'M': ('ATG',),
'N': ('AAT', 'AAC'),
'P': ('CCT', 'CCC', 'CCA', 'CCG'),
'Q': ('CAA', 'CAG'),
'R': ('CGT', 'CGC', 'CGA', 'CGG', 'AGA', 'AGG'),
'S': ('TCT', 'TCC', 'TCA', 'TCG', 'AGT', 'AGC'),
'T': ('ACT', 'ACC', 'ACA', 'ACG'),
'V': ('GTT', 'GTC', 'GTA', 'GTG'),
'W': ('TGG',),
'Y': ('TAT', 'TAC'),}
Run Code Online (Sandbox Code Playgroud)

我想为给定的“键”序列创建所有可能的三元组组合。例如,FMW序列应具有以下两个结果: TTTATGTGGTTCATGTGG。组合的数量应该是字典中每个键的值的数量的乘积。在我们的例子中,FMW应该是 2*1*1 = 2 个组合。

对于 10 个(或更多)字母的序列进行此类计算,哪种方法最 Pythonic、最有效?Biopython 包中是否有已经实现的方法?

提前致谢。

Viv*_*gan 5

假设seq这里是您拥有的密钥列表。如果您有任何其他形式(例如 a string),它可以轻松地被视为char数组并分解为seq列表。一旦你这样做了,你就会非常itertools出色地完成你想要的事情。这是完整的代码 -

import itertools
codon_table = {
'A': ('GCT', 'GCC', 'GCA', 'GCG'),
'C': ('TGT', 'TGC'),
'D': ('GAT', 'GAC'),
'E': ('GAA', 'GAG'),
'F': ('TTT', 'TTC'),
'G': ('GGT', 'GGC', 'GGA', 'GGG'),
'H': ('CAT', 'CAC'),
'I': ('ATT', 'ATC', 'ATA'),
'K': ('AAA', 'AAG'),
'L': ('TTA', 'TTG', 'CTT', 'CTC', 'CTA', 'CTG'),
'M': ('ATG',),
'N': ('AAT', 'AAC'),
'P': ('CCT', 'CCC', 'CCA', 'CCG'),
'Q': ('CAA', 'CAG'),
'R': ('CGT', 'CGC', 'CGA', 'CGG', 'AGA', 'AGG'),
'S': ('TCT', 'TCC', 'TCA', 'TCG', 'AGT', 'AGC'),
'T': ('ACT', 'ACC', 'ACA', 'ACG'),
'V': ('GTT', 'GTC', 'GTA', 'GTG'),
'W': ('TGG',),
'Y': ('TAT', 'TAC'),}

seq = ['F', 'M', 'W']
t1, t2, t3 = [ list(codon_table[key]) for key in seq ]
print(list(itertools.product(t1, t2, t3)))
Run Code Online (Sandbox Code Playgroud)

输出

[('TTT', 'ATG', 'TGG'), ('TTC', 'ATG', 'TGG')]
Run Code Online (Sandbox Code Playgroud)

运算输出

此外,如果您想要完全按照您想要的方式输出,而不是最后一个打印语句,您可以选择 -

output = list(itertools.product(t1, t2, t3))
print(output)

output_flat = [ ''.join(a) for a in output ]
print(output_flat)
Run Code Online (Sandbox Code Playgroud)

这输出 -

['TTTATGTGG', 'TTCATGTGG']
Run Code Online (Sandbox Code Playgroud)

希望有帮助。干杯!