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

问题描述 投票:0回答:2

我有以下字典,其中包含每个氨基酸(键|字母)所有可能的密码子(值|三联体)。这本字典在生物信息学中也被称为“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'),}

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

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

提前致谢。

python python-3.x combinations combinatorics biopython
2个回答
5
投票

假设

seq
这里是您拥有的密钥列表。如果您有任何其他形式(例如
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']
t = [ list(codon_table[key]) for key in seq ]
print(list(itertools.product(*t)))

输出

[('TTT', 'ATG', 'TGG'), ('TTC', 'ATG', 'TGG')]

OP输出

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

output = list(itertools.product(*t))
print(output)

output_flat = [ ''.join(a) for a in output ]
print(output_flat)

此输出 -

['TTTATGTGG', 'TTCATGTGG']

希望有帮助。干杯!


0
投票

与您的问题关系不大,但这是正则表达式格式的扩展密码子表。我认为它可能会有所帮助,因为它允许模糊匹配(核苷酸和氨基酸)。它还将显着减少产量。注意 - 由于长度无法发表评论。

codon_table = {
'A':['[GRSK][CYSM].'],
'B':['[ARWM][ARWM][CTYWKSM]', '[GRSK][ARWM][TCYWKSM]'],
'C':['[TYWK][GRSK][TCYWKSM]'],
'D':['[GRSK][ARWM][TCYWKSM]'],
'E':['[GRSK][ARWM][AGRSKWM]'],
'F':['[TYWK][TYWK][CTYWKSM]'],
'G':['[GRSK][GRSK].'],
'H':['[CYSM][ARWM][TCYWKSM]'],
'I':['[ARWM][TYWK][^G]'],
'J':['[ARWM][TYWK][^G]', '[CYSM][TYWK].', '[TYWK][TYWK][AGRSKWM]'],
'K':['[ARWM][ARWM][AGRSKWM]'],
'L':['[CYSM][TYWK].', '[TYWK][TYWK][AGRSKWM]'],
'M':['[ARWM][TYWK][GRSK]'],
'N':['[ARWM][ARWM][CTYWKSM]'],
'O':['[TYWK][ARWM][GRSK]'],
'P':['[CYSM][CYSM].'],
'Q':['[CYSM][ARWM][AGRSKWM]'],
'R':['[CYSM][GRSK].', '[ARWM][GRSK][GARSKWM]'],
'S':['[TYWK][CYSM].', '[ARWM][GRSK][CTYWKSM]'],
'T':['[ARWM][CYSM].'],
'U':['[TYWK][GRSK][ARWM]'],
'V':['[GRSK][TYWK].'],
'W':['[TYWK][GRSK][GRSK]'],
'X':['...'],
'Y':['[TYWK][ARWM][CTYWKSM]'],
'Z':['[CYSM][ARWM][AGRSKWM]','[GRSK][ARWM][AGRSKWM]'],
'_':['[TYWK][ARWM][AGRSKWM]', '[TYWK][GRSK][ARWM]'],
'*':['[TYWK][ARWM][AGRSKWM]', '[TYWK][GRSK][ARWM]']}
© www.soinside.com 2019 - 2024. All rights reserved.