为什么我会收到错误TypeError:unhashable type:' list'?

时间:2016-02-27 02:42:29

标签: python

RNA_codon_dictonary = {
    'UUU': 'F',     'CUU': 'L',     'AUU': 'I',     'GUU': 'V',
    'UUC': 'F',     'CUC': 'L',     'AUC': 'I',     'GUC': 'V',
    'UUA': 'L',     'CUA': 'L',     'AUA': 'I',     'GUA': 'V',
    'UUG': 'L',     'CUG': 'L',     'AUG': 'M',     'GUG': 'V',
    'UCU': 'S',     'CCU': 'P',     'ACU': 'T',     'GCU': 'A',
    'UCC': 'S',     'CCC': 'P',     'ACC': 'T',     'GCC': 'A',
    'UCA': 'S',     'CCA': 'P',     'ACA': 'T',     'GCA': 'A',
    'UCG': 'S',     'CCG': 'P',     'ACG': 'T',     'GCG': 'A',
    'UAU': 'Y',     'CAU': 'H',     'AAU': 'N',     'GAU': 'D',
    'UAC': 'Y',     'CAC': 'H',     'AAC': 'N',     'GAC': 'D',
    'UAA': 'Stop',  'CAA': 'Q',     'AAA': 'K',     'GAA': 'E',
    'UAG': 'Stop',  'CAG': 'Q',     'AAG': 'K',     'GAG': 'E',
    'UGU': 'C',     'CGU': 'R',     'AGU': 'S',     'GGU': 'G',
    'UGC': 'C',     'CGC': 'R',     'AGC': 'S',     'GGC': 'G',
    'UGA': 'Stop',  'CGA': 'R',     'AGA': 'R',     'GGA': 'G',
    'UGG': 'W',     'CGG': 'R',     'AGG': 'R',     'GGG': 'G'
}


def RNA_to_Protien(mRNA_seq):
    codon = []
    if codon in RNA_codon_dictonary:
        # return the aminoacid by looking up in the dictionary:
        return RNA_codon_dictonary[codon]
    else:
        # return '' if we could not translate the codon:
        return '?'

if __name__ == "__main__":

    mRNA_seq = "UCAAUGUAACGCGCUACCCGGAGCUCUGGGCCCAAAUUUCAUCCACU"

    print (RNA_to_Protien(mRNA_seq))

1 个答案:

答案 0 :(得分:1)

您正在检查空列表是否是字典中的键。这有两个问题:

1)答案永远不会,因为你的字典没有任何空键,

2)甚至不允许该操作,因为永远不允许list成为dict的密钥。

根据您的评论,以下代码可能就是您要查找的内容。它打破了长度为3的非重叠子串中的序列,查找dict中的每个子字符串,并返回所有结果。

def RNA_to_Protien(mRNA_seq):
    return [
        RNA_codon_dictonary.get(mRNA_seq[i:i+3], '?')
        for i in range(0, len(mRNA_seq), 3)
    ]

在您的示例序列中,返回:

['S', 'M', 'Stop', 'R', 'A', 'T', 'R', 'S', 'S', 'G', 'P', 'K', 'F', 'H', 'P', '?']

或者,如果您希望查找重叠序列,请尝试以下方法:

def RNA_to_Protien(mRNA_seq):
    return [
        RNA_codon_dictonary.get(mRNA_seq[i:i+3], '?')
        for i in range(0, len(mRNA_seq)-2, 1)
    ]

它产生了这个结果:

['S', 'Q', 'N', 'M', 'C', 'V', 'Stop', 'N', 'T', 'R', 'A', 'R', 'A', 'L', 'Y', 'T', 'P', 'P', 'R', 'G', 'E', 'S', 'A', 'L', 'S', 'L', 'W', 'G', 'G', 'A', 'P', 'P', 'Q', 'K', 'N', 'I', 'F', 'F', 'S', 'H', 'I', 'S', 'P', 'H', 'T']

并且,根据您的请求返回单个字符串而不是字符串列表:

def RNA_to_Protien(mRNA_seq):
    return ''.join(
        RNA_codon_dictonary.get(mRNA_seq[i:i+3], '?')
        for i in range(0, len(mRNA_seq), 3)
    )

这会产生:

'SMStopRATRSSGPKFHP?'