首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能做到以下的比较,而不必写20个if-陈述或列出20个列表/字典?

我怎样才能做到以下的比较,而不必写20个if-陈述或列出20个列表/字典?
EN

Stack Overflow用户
提问于 2013-11-06 00:50:20
回答 5查看 1.1K关注 0票数 4

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

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

对于我名单上的每一个密码子,我想最终找出它对应的氨基酸。因此,我必须先将这个密码子与我发布链接的密码子列表(64个可能的密码子)进行比较,然后我必须要求程序查看该密码子对应的氨基酸。然而,我想不出一种快捷的方法来做到这一点,而不需要为所有对应于给定氨基酸的密码子做一个列表并进行比较,或者写20个不同的if语句。

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

以下是我根据建议所做的工作:

codon_lookup ={“GCT”:“a”、“GCC”:“a”、“GCA”:“a”、“GCG”:“a”、“TGT”:“C”、“TGC”、“GAT”:“d”、“GAC”:“d”、“GAA”:“e”、“GAG”、“e”、“TTT”:“F”、“TTC”、“GGT”、“G”,“GGG”:“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”,“CTG”:“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”,'AGC':'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','ACG':'T',‘ACG’:'T','GTT':'V','GTC':'V','GTA':'V','GTG':'V','TGG‘= 'W',’TGG‘=’W‘,'TAC':'Y','TAA':'Z','Z','TGA':'Z'}

代码语言:javascript
复制
for c in mutated_codon:
   print codon_lookup[c]

HOwever,在我的输出中,我只输出对应于列表上最后一个密码子的氨基酸,最重要的是,我得到了KeyError: 4。有什么不对的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-06 05:53:33

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

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

代码语言:javascript
复制
for codon in mutated_codon:
    print codon_lookup[codon]

或者,在Python 3.x中:

代码语言:javascript
复制
for codon in mutated_codon:
    print(codon_lookup[codon])

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

如果我正在编写这段代码,我可能会为这些变异密码子推导出一个氨基酸列表,并可能在该列表上打印或执行其他事情。最简单的方法是使用列表理解来定义新列表:

代码语言:javascript
复制
acids = [codon_lookup[codon] for codon in mutated_codon]

这或多或少是用于构建新列表的for循环的语法糖:

代码语言:javascript
复制
acids = []
for codon in mutated_codon:
    acids.append(codon_lookup[codon])

但它更简洁。在没有实际测试两个不同版本的情况下,我不太愿意描述性能,但我相信列表理解表单也更快。

不管是哪种方式,我都可以迭代这个列表来打印它们:

代码语言:javascript
复制
for acid in acids:
    print acid

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

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

代码语言:javascript
复制
for codon in mutated_codon:
    print codon_lookup.get(codon, '*')

既然我前面提到了生物巨蟒,下面是他们的文档中使用translate将DNA核苷酸转换成氨基酸的一个例子:

代码语言:javascript
复制
>>> 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(), '*'))

我联系到的文档有更多的细节。它可能超出了您对这一特定任务的需要,但如果您需要将其进一步深入到一个简单的翻译表中,它可能会为您节省一些工作。

票数 3
EN

Stack Overflow用户

发布于 2013-11-06 00:55:43

你可以像这样建立一本字典:

代码语言:javascript
复制
codon_lookup = {
    'ATT':'Isoleucine',
    'ATC':'Isoleucine', 
    'ATA':'Isoleucine',
    'CTT':'Leucine',
    'CTC':'Leucine', 
    'CTA':'Leucine',
     # ... etc
} 

然后,您可以进行如下查询:

代码语言:javascript
复制
codon_lookup['ATT']

这会给你

代码语言:javascript
复制
'Isoleucine'

编辑:

你可以像这样建立一本字典:

代码语言:javascript
复制
codon_lookup = {
    'ATT':'I',
    'ATC':'I', 
    'ATA':'I',
    'CTT':'L',
    'CTC':'L', 
    'CTA':'L',
     # ... etc
} 

然后,您可以进行如下查询:

代码语言:javascript
复制
codon_lookup['ATT']

这会给你

代码语言:javascript
复制
'I'

如果您想要根据此字典检查您的mutated_condons列表,您可以这样循环遍历它。如果您的mutated_condons列表看起来像['ACA','GTT',...],那么:

代码语言:javascript
复制
for mutated_codon in mutated_condons:
    print codon_lookup[mutated_codon]
票数 11
EN

Stack Overflow用户

发布于 2013-11-06 02:03:21

根据另外两个答案,这是另一种构造它的方法,我认为这是最好的。

这将为您在两个方向查找字典: SLC到Codon(s)和Codon to SLC。

代码语言:javascript
复制
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'}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19802024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档