我知道您不能将列表用作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类型,应该没问题。另外,据我所知,使用列表作为值也应该没问题。关于这里可能发生什么的任何想法?
答案 0 :(得分:4)
问题是该行的另一半,entrez_eq.get(v)
。在那里,您使用列表v
作为可能是字典或其他映射的关键。
(您可以告诉v
是list
,因为它是来自dbrefs
的值,您打印dbrefs
,因此它是['MGI:1920949']
或{{ 1}}。)
每当遇到这样的问题时,你无法弄清楚错误的来源,请尝试将其分解成碎片。而不是:
['73699']
这样做:
sp_eq[row.get('name')] = entrez_eq.get(v)
然后你可以找出表达式的三个子部分中的哪一部分 - 如果你还不知道为什么,你可以访问中间值和类型,这样你就可以记录它们。