【问题标题】:unhashable type error when trying to convert an rna string尝试转换 rna 字符串时出现不可散列的类型错误
【发布时间】:2014-05-04 05:58:26
【问题描述】:

在我目前正在处理的代码中,我有一个名为 codon_dict 的字典,其中包含所有三个字母密码子的列表,这些密码子可以翻译成各自的氨基酸。我还有一个名为 rnaCodonTable 的表,它的值是单字母氨基酸,键是它对应的三字母密码子。我想要做的是得到一个每三个碱基对的 rna 碱基字符串,将其识别为我的字典中的密码子,并将其翻译成他们编码的单字母氨基酸。这是我到目前为止的设置:

for i in range (0, len(self.codon_dict), 3): 
            codon = self.codon_dict[i:i+3] 
            print (codon)
            if codon in NucParams.codon_dict():
                self.codon_dict[codon] +=1

#codons are then converted to amino acids.
            temp_aa = NucParams.rnaCodonTable(codon)
            if temp_aa in self.aa_dict:
                self.aa_dict[temp_aa] += 1

我收到此错误消息:codon = self.codon_dict[i:i+3] TypeError: unhashable type: 'slice'

我不确定我在这里做错了什么。有人可以向我解释这个错误吗?

rnaCodonTable 如下所示:

 rnaCodonTable = {
    # RNA codon table
    # U
    'UUU': 'F', 'UCU': 'S', 'UAU': 'Y', 'UGU': 'C', # UxU
    'UUC': 'F', 'UCC': 'S', 'UAC': 'Y', 'UGC': 'C', # UxC
    'UUA': 'L', 'UCA': 'S', 'UAA': '-', 'UGA': '-', # UxA
    'UUG': 'L', 'UCG': 'S', 'UAG': '-', 'UGG': 'W', # UxG
    # C
    'CUU': 'L', 'CCU': 'P', 'CAU': 'H', 'CGU': 'R', # CxU
    'CUC': 'L', 'CCC': 'P', 'CAC': 'H', 'CGC': 'R', # CxC
    'CUA': 'L', 'CCA': 'P', 'CAA': 'Q', 'CGA': 'R', # CxA
    'CUG': 'L', 'CCG': 'P', 'CAG': 'Q', 'CGG': 'R', # CxG
    # A
    'AUU': 'I', 'ACU': 'T', 'AAU': 'N', 'AGU': 'S', # AxU
    'AUC': 'I', 'ACC': 'T', 'AAC': 'N', 'AGC': 'S', # AxC
    'AUA': 'I', 'ACA': 'T', 'AAA': 'K', 'AGA': 'R', # AxA
    'AUG': 'M', 'ACG': 'T', 'AAG': 'K', 'AGG': 'R', # AxG
    # G
    'GUU': 'V', 'GCU': 'A', 'GAU': 'D', 'GGU': 'G', # GxU
    'GUC': 'V', 'GCC': 'A', 'GAC': 'D', 'GGC': 'G', # GxC
    'GUA': 'V', 'GCA': 'A', 'GAA': 'E', 'GGA': 'G', # GxA
    'GUG': 'V', 'GCG': 'A', 'GAG': 'E', 'GGG': 'G' # GxG
    }

【问题讨论】:

  • 您能发布self.codon_dict 包含的内容吗?
  • codon_dict = {} for aa in self.rnaCodonTable.keys(): codon_dict[aa] = 0 self.codon_dict = codon_dict
  • 而rnaCodonTable中的键是三个字母的密码子
  • 如果codon_dict 包含与rnaCodonTable 相同的键,那么它的意义何在?
  • 我想稍后创建codon_dict,当我想找到字符串的密码子组成时,我只需要返回codon_dict。

标签: python


【解决方案1】:

有人可以向我解释这个错误吗?

字典是一个键查找表,键必须是可散列的。在您的代码中,i:i:3 的值是不可散列的类型 slice,它不能是字典的键。

这是您的错误的简化版本,使用了另一种不可散列的类型,一个列表:

>>> d = {}  # An empty dictionary
>>> d[[1,2]] = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

我想我明白你在做什么,我相信你有一个代表 RNA 链的字符串,像这样:

s = 'AUUGCUAAAAAGGAGGAUUUUCG'

您想从rnaCodonTable 字典中获取相应的密码子。

所以,问题是将 RNA 链分成三个字母位,然后您可以在密码子表中查找:

为了让生活更轻松,请使用grouper recipe

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

s = 'AUUGCUAAAAAGGAGGAUUUUCG'

codons = []

for pair in grouper(s, 3):
    codons.append(rna_codon_table[''.join(pair)])

print('Codons: {}'.format(''.join(codons))

grouper 将返回一个元组,我们的键是字符串,因此我们将元组与一个空白字符串连接起来以创建一个三字母配对:

>>> for pair in grouper(s, 3):
...    print(pair)
...
('A', 'U', 'U')
('G', 'C', 'U')
('A', 'A', 'A')
('A', 'A', 'A')
('G', 'G', 'A')
('G', 'G', 'U')
('U', 'U', 'U')
('U', 'C', 'G')
>>> for pair in grouper(s,3):
...     print(''.join(pair))
...
AUU
GCU
AAA
AAA
GGA
GGU
UUU
UCG

接下来,我们获取对应于每三个字母对的密码子并将它们存储在一个列表中。最后,我们将列表打印为字符串。

您可以将循环组合成一个生成器,然后直接使用它,如下所示:

codons = ''.join(rna_codon_table[''.join(pair)] for pair in grouper(s, 3))

我根据Python style guide更改了您字典的大小写。

【讨论】:

  • 哦,所以将我的列表放入一个元组应该可以解决问题吗?不过,我没有使用列表。我有一个字符串...
  • @user3504701 实际上您使用的是slice,正如您的回溯所证明的那样
  • 谢谢。我还听说你可以用frozenset 制作一个可散列的字典。我也可以使用它吗?
  • @user3504701 不,因为你缺少一些基本的东西。您在上面发布的代码中实际上没有字符串。阅读我的 cmets 关于您的问题,并重新阅读 BurhanKhalid 给您的答案。您在这里没有使用字符串,但您坚持使用,所以这个错误似乎是印刷错误。
猜你喜欢
  • 1970-01-01
  • 2022-09-22
  • 2016-10-27
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多