0

我知道您不能将列表用作 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 类型,应该没问题。另外,据我了解,使用列表作为此处的值也应该没问题。关于这里可能发生的任何想法?

4

1 回答 1

4

问题是行的另一半,entrez_eq.get(v). 在那里,您使用列表v作为可能是 dict 或其他映射的键。

(你可以说v是 a list,因为它是来自 的值dbrefs,而你 print dbrefs,所以它是['MGI:1920949']or ['73699']。)


每当您遇到这样的问题时,您无法确定错误来自何处,请尝试将其分解。而不是这个:

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

做这个:

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

然后您可以找出表达式的三个子部分中的哪一个在引发——如果您仍然不知道为什么,您可以访问中间值和类型,以便记录它们。

于 2013-06-13T21:52:22.727 回答