Я знаю, что вы не можете использовать список в качестве ключа в словаре 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, и должен будь умницей. Кроме того, насколько я понимаю, использование списка в качестве значения здесь также должно быть прекрасным. Любые идеи относительно того, что здесь может произойти?
Правильно - из dbrefs видно, что значения представляют собой списки строк. –
Да, вы правы! (facepalm) Я соглашусь, когда это позволит мне, эта небольшая ошибка заставляла меня сходить с ума в течение последних 2 часов, очень ценится! – Houdini
@PeterDeGlopper: Да, я должен был объяснить, как я знал, что 'v' был« списком ». Спасибо, что указали это в комментарии. – abarnert