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':'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。有什么想法可能是错的吗?

4

5 回答 5

11

您可以像这样设置字典:

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

那么您可以进行如下查询

codon_lookup['ATT']

哪个会给你

'Isoleucine'

编辑:

您可以像这样设置字典:

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

那么您可以进行如下查询

codon_lookup['ATT']

哪个会给你

'I'

如果你想mutated_condons对照这本字典检查你的列表,你可以像这样循环遍历它。如果您的mutated_condons列表如下所示['ACA','GTT',...]

for mutated_codon in mutated_condons:
    print codon_lookup[mutated_codon]
于 2013-11-06T00:55:43.670 回答
5

鉴于其他两个答案,这是我认为可能是最好的另一种结构方式。

这将为您提供双向查找字典:SLC 到 Codon(s) 和 Codon 到 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'}
于 2013-11-06T02:03:21.167 回答
3

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

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

for codon in mutated_codon:
    print codon_lookup[codon]

或者,在 Python 3.X 中:

for codon in mutated_codon:
    print(codon_lookup[codon])

命名 list 会更符合 Python 的惯用风格mutated_codons,因为它几乎肯定会是复数,但这没什么大不了的。下面我继续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字典上的方法。KeyError上面的代码都在字典上使用直接键查找,如果在字典中找不到你的密码子,它将引发 a codon_lookup。这可能是最好的选择 - 您正在使用有限范围的输入,如果某些事情导致您在mutated_codon列表中获得一个不是有效密码子的字符串,您可能希望看到该异常而不是隐藏它。但是,如果在未来的某些情况下,您正在处理控制较少的输入,您可能会发现get方法有用。字典的这个方法接受一个键和一个可选的默认值。如果键在字典中,则返回该键的字典值。如果键不在字典中,则返回默认值(如果提供了)或None(如果没有提供)。例如,如果您希望您的代码将任何未知密码子视为终止符,您可以编写如下内容:

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

由于我之前提到过biopython,这里有一个例子取自他们的文档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(), '*'))

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

于 2013-11-06T05:53:33.107 回答
2

您可以按原样写下表格(来自您提供的链接):

table =
    [
        {
            'amino_acid': 'Isoleucine',
            'codons': [ 'ATT', 'ATC', 'ATA' ]
        },
        {
            'amino_acid': 'Leucine',
            'codons': [ 'CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG' ]
        },
        ...etc...
    ]

然后使用以下内容转换为从密码子映射到氨基酸的字典:

lookup = dict(itertools.chain.from_iterable(
    [[(codon, row['amino_acid']) for codon in row['codons']] for row in table]))

例如,lookup['TTA']给出'Leucine'.

我觉得这比在farmerjoe的回答中重复氨基酸名称稍微优雅一些​​,但这可能是一个见仁见智的问题。最好以最简洁的方式进行数据输入,然后以编程方式对其进行转换,而不是手动进行转换。

于 2013-11-06T01:04:45.880 回答
1

拿起 Timothy Shields 对他自己的回答的评论,如果您可以从http://www.cbs.dtu.dk/courses/27619/codon.html获取表格并从中生成您的映射,那就太好了。

如果您尝试从网页复制表格并将其作为文字字符串粘贴到源代码中,您会看到一些问题。首先,不同的浏览器对于如何复制表格有不同的想法。更严重的是,表格写得很不规则;有些列没有换行符,有些列有一个,有些列有两个,有些甚至在换行符之后有空格。这将很难解析。

但是,如果您采用 HTML 源代码,则要容易得多。不像它应该的那么容易(页面是一团糟,任何地方都没有 ID 或名称,以及老式的 HTML 样式而不是 CSS,等等),但很明显,您想要的值正是表格列,除了顶部没有盒子表、盒子页眉和页脚。因此,这是一个示例,说明如何使用BeautifulSoup. (如果您需要坚持使用标准库,这会更冗长,但不会那么难。)

import urllib2
import bs4

url='http://www.cbs.dtu.dk/courses/27619/codon.html'
page = urllib2.urlopen(url)
soup = bs4.BeautifulSoup(page)
codon_lookup = {}
for row in soup.find_all('tr')[2:-1]:
    amino, slc, codons = (col.text.strip() for col in row.find_all('td'))
    if slc == 'Stop':
        slc = 'Z'
    for codon in codons.split(','):
        codon_lookup[codon.strip()] = slc

当然,在现实生活中,您可能不希望您的程序每次需要运行时都必须联机。但是您可以轻松地让该程序将结果保存到 pickle 文件(或 JSON 文件,或您喜欢的任何其他文件)。只需添加这些行:

import pickle
with open('codons.pickle', 'wb') as f:
    pickle.dump(codon_lookup, f)

现在,在您的主程序中,您只需从以下内容开始:

with open('codons.pickle', 'rb') as f:
    codon_lookup = pickle.load(f)
于 2013-11-06T19:17:14.683 回答