在不必编写20个ifstatement或编制20个列表/字典的情况下,如何进行以下比较?

2024-05-20 14:10:45 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与生物学有关,所以对于那些知道氨基酸和密码子的人来说,这太好了!对于那些不知道的人,我已经尽我最大的努力去表达它,以便你能理解我在说什么。在

所以我有一个密码子列表,也可以称为3个字母的字符串,由以下四个字母组成:a、G、C、T,即AAT、GAT、GCT等。每个密码子对应一个特定的氨基酸,但也有多个密码子可以对应同一个氨基酸。为了说明这一点,请看一下这个链接:http://www.cbs.dtu.dk/courses/27619/codon.html。这应该很清楚。在

对于我列表中的每个密码子,我想最终找出它对应的氨基酸。因此,我必须让程序首先将该密码子与我发布链接的密码子列表(共64个可能密码子)进行比较,然后我必须要求程序查看密码子对应的氨基酸。然而,我想不出一个快捷的方法来完成这项工作,而不必列出与给定氨基酸相对应的所有密码子并进行比较,或者编写20个不同的if语句。在

我的密码子列表叫做变异密码子。因此,我需要生成一个'for',程序会比较我的变异密码子列表上的每个密码子,并将其与字典进行比较,然后输出相应的氨基酸字母。我要写什么代码才能做到这一点?我不熟悉字典中用于检查值的语法。在

以下是我目前根据建议所做的:

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

for c in mutated_codon:
   print codon_lookup[c]

但是,在我的输出中,我只得到与列表中最后一个密码子对应的氨基酸的输出,除此之外,我还得到了KeyError:4。有什么问题吗?在


Tags: 字符串程序列表for字典链接字母lookup
3条回答

根据另外两个答案,这里有另一种我认为可能是最好的组织方式。在

这将提供两个方向的查找字典:SLC到密码子和密码子到SLC。在

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

codon_slc = dict((x, k) for k, v in slc_codon.items() for x in v)

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

您可以这样设置词典:

codon_lookup = {
    'ATT':'Isoleucine',
    'ATC':'Isoleucine', 
    'ATA':'Isoleucine',
    'CTT':'Leucine',
    'CTC':'Leucine', 
    'CTA':'Leucine',
     # ... etc
} 

然后你可以像

^{pr2}$

这会给你

'Isoleucine'

编辑:

您可以这样设置词典:

codon_lookup = {
    'ATT':'I',
    'ATC':'I', 
    'ATA':'I',
    'CTT':'L',
    'CTC':'L', 
    'CTA':'L',
     # ... etc
} 

然后你可以像

^{pr2}$

这会给你

'I'

如果你想对照这个字典检查你的mutated_condons列表,你可以这样循环。如果您的mutated_condons列表看起来像['ACA','GTT',...],那么:

for mutated_codon in mutated_condons:
    print codon_lookup[mutated_codon]

回答只是为了回答如何从字典中查找蛋白质的问题。正确地创建字典是你问题的核心,到目前为止给出的答案都很好地解决了这个问题。我个人最喜欢FogleBird的逆向结构,但是任何一种将核苷酸符号三元组映射到氨基酸的字典定义方法都可以。在

如果您在对问题的编辑中定义了codon_lookup字典和一个名为mutated_codon的三个字母字符串的列表,从一系列突变密码子中打印氨基酸符号的最简单方法是:

for codon in mutated_codon:
    print codon_lookup[codon]

或者,在Python 3.X中:

^{pr2}$

将列表命名为mutated_codons会更符合通常的Python风格,因为它几乎肯定是复数形式,但这不是什么大问题。我将继续下面的mutated_codon。在

如果我写这段代码,我可能会得到一个变异密码子的氨基酸列表,并可能打印或做其他事情。最简单的方法是使用列表理解来定义新列表:

acids = [codon_lookup[codon] for codon in mutated_codon]

对于构建新列表的for循环来说,这或多或少是语法上的甜点:

acids = []
for codon in mutated_codon:
    acids.append(codon_lookup[codon])

但它更简洁。如果不实际测试这两个不同的版本,我不太愿意描述性能,但我相信列表理解形式也更快。在

不管是哪种方式,我都可以遍历该列表以打印它们:

for acid in acids:
    print acid

以及做任何进一步的必要处理。在

另一个值得指出的选项是字典中的get方法。上面的代码都使用字典上的直接键查找,如果在codon_lookup字典中找不到您的密码子,则会引发一个KeyError。这可能是最好的选择-您使用的是有限的输入范围,如果某些东西导致您在mutated_codon列表中得到的字符串不是有效密码子,您可能希望看到该异常而不是隐藏它。但是,如果在将来的某个情况下,您处理的输入控制较少,您可能会发现get方法很有用。字典的这个方法接受一个键和一个可选的默认值。如果键在字典中,则返回字典中该键的值。如果键不在字典中,则返回默认值(如果提供了一个)或None(如果没有)。例如,如果您希望您的代码将任何未知密码子视为停止,则可以编写如下内容:

for codon in mutated_codon:
    print codon_lookup.get(codon, '*')

因为我前面提到了biopython,这里有一个例子,来自他们的docs使用translate将DNA核苷酸转换为氨基酸:

>>> from Bio.Seq import Seq
>>> from Bio.Alphabet import generic_dna
>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", generic_dna)
>>> coding_dna.translate()
Seq('MAIVMGR*KGAR*', HasStopCodon(ExtendedIUPACProtein(), '*'))

我链接的文件有很多细节。它可能比这个特定任务所需的要多,但是如果您需要比一个简单的翻译表更进一步,它可能会为您节省一些工作。在

相关问题 更多 >