键值对的可能值是不可用的?

时间:2013-06-13 21:49:43

标签: python list dictionary

我知道您不能将列表用作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 个答案:

答案 0 :(得分:4)

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

(您可以告诉vlist,因为它是来自dbrefs的值,您打印dbrefs,因此它是['MGI:1920949']或{{ 1}}。)


每当遇到这样的问题时,你无法弄清楚错误的来源,请尝试将其分解成碎片。而不是:

['73699']

这样做:

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

然后你可以找出表达式的三个子部分中的哪一部分 - 如果你还不知道为什么,你可以访问中间值和类型,这样你就可以记录它们。