2013-06-13 3 views
0

Я знаю, что вы не можете использовать список в качестве ключа в словаре Python, потому что он изменен и, следовательно, не hashable (или что-то вроде этого). Но я, кажется, получаю эту ошибку на 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

Проблема в том, что другая половина линии, entrez_eq.get(v). Там вы используете список v как ключ к тому, что предположительно является диктоном или другим сопоставлением.

(Вы можете сказать v является list, потому что это значение из 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 

Тогда вы можете выяснить, какой из трех подразделов выражения является повышение-и, если вы до сих пор не знаю, почему, у вас есть доступ к промежуточным значениям и типам, поэтому вы можете их зарегистрировать.

+1

Правильно - из dbrefs видно, что значения представляют собой списки строк. –

+0

Да, вы правы! (facepalm) Я соглашусь, когда это позволит мне, эта небольшая ошибка заставляла меня сходить с ума в течение последних 2 часов, очень ценится! – Houdini

+0

@PeterDeGlopper: Да, я должен был объяснить, как я знал, что 'v' был« списком ». Спасибо, что указали это в комментарии. – abarnert

Смежные вопросы