我知道您不能在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,应该可以。另外,据我了解,使用列表作为此处的值也应该很好。关于这里可能发生什么的任何想法?
1 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
问题是该行的另一半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
然后,您可以找出表达式的三个子部分中的哪一个正在上升—并且,如果仍然不知道为什么,则可以访问中间值和类型,因此可以对其进行记录。
添加回答
举报
0/150
提交
取消