键值对的可能值不可散列?

我知道您不能在Python字典中使用列表作为键,因为它是可变的,因此不可散列(或类似的东西)。但是我似乎在而value不是上遇到此错误key。这是我的一些代码:


sp_eq = {}

sp_list = []

def build_sp_eq(row):

    # dbrefs is a dict, i.e { reference_type : id_of_that_gene}

    dbrefs = row.get('dbReference')

    print('dbrefs - ' +str(dbrefs))

    gene_ids = []

    for k, v in dbrefs.items():

        if k == 'GeneId':

            gene_ids.append(v)

    # new ID if more than 1 entrez reference

    if len(gene_ids) > 1:

                print('More than 1 GeneId for: ' +str(row.get('name')))

                sp_eq[row.get('name')] = uuid.uuid4()

    if len(gene_ids) == 0:

        # new if 0 entrez references

        sp_eq[row.get('name')] = uuid.uuid4()

        sp_list.append(row.get('name'))

    # if only one entrez ref, use the entrez uuid

    elif len(gene_ids) == 1:

        pdb.set_trace()

        print('type of row.get('name'): ' +str(type(row.get('name'))))

        sp_eq[row.get('name')] = entrez_eq.get(v)

这是解释器的输出:


dbrefs - {'HGNC': ['HGNC:4931']}

dbrefs - {'HGNC': ['HGNC:4931']}

dbrefs - {'HGNC': ['HGNC:4932']}

dbrefs - {'MGI': ['MGI:1920949'], 'GeneId': ['73699']}

type of row.get('name'): <class 'str'>

Traceback (most recent call last):

  File "./gp_baseline.py", line 303, in <module>

    make_namespace(x, parser)

  File "./gp_baseline.py", line 247, in make_namespace

    build_sp_eq(row)

  File "./gp_baseline.py", line 144, in build_sp_eq

    sp_eq[row.get('name')] = entrez_eq.get(v)

TypeError: unhashable type: 'list'

如您所见,key在这种情况下,row.get('name')的类型为String,应该可以。另外,据我了解,使用列表作为此处的值也应该很好。关于这里可能发生什么的任何想法?


RISEBY
浏览 165回答 1
1回答

哆啦的时光机

问题是该行的另一半entrez_eq.get(v)。在那里,您将列表v用作推测为dict或其他映射的键。(您可以说v是一个,list因为它是from中的一个值dbrefs,并且您进行打印dbrefs,所以它是['MGI:1920949']或['73699']。)每当遇到这样的问题(无法弄清错误来源)时,请尝试将其分解为几部分。代替这个:sp_eq[row.get('name')] = entrez_eq.get(v)做这个:key = row.get('name')value = entrez_eq.get(v)sp_eq[key] = value然后,您可以找出表达式的三个子部分中的哪一个正在上升—并且,如果仍然不知道为什么,则可以访问中间值和类型,因此可以对其进行记录。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python