Python dictionary: TypeError: unhashable type: 'list'
У меня возникают проблемы с заполнением словаря python, начиная с другого словаря.
Предположим, что "исходный" словарь имеет строку в виде ключей и имеет список настраиваемых объектов на значение.
Я создаю свой целевой словарь точно так же, как создаю свой "исходный" словарь, как это возможно, это не работает?
Я получаю
TypeError: unhashable type: 'list'
Код:
aTargetDictionary = {}
for aKey in aSourceDictionary:
aTargetDictionary[aKey] = []
aTargetDictionary[aKey].extend(aSourceDictionary[aKey])
Ошибка в этой строке: aTargetDictionary[aKey] = []
Ответы
Ответ 1
Ошибка, которую вы указали, связана с тем, что в python ключи словаря должны быть неизменяемыми типами (если ключ может измениться, будут проблемы), а список является изменяемым типом.
В вашей ошибке говорится, что вы пытаетесь использовать список в качестве словарного ключа, вам нужно будет изменить свой список на кортежи, если вы хотите поместить их в качестве ключей в словаре.
В соответствии с документом python:
Единственными типами значений, неприемлемых в качестве ключей, являются значения, содержащие списки или словари или другие изменяемые типы, которые сравниваются а не идентификацией объекта, причина в том, что для эффективной реализации словарей требуется хэш-значение ключей оставаться постоянным
Ответ 2
Это действительно довольно странно.
Если aSourceDictionary
был словарем, я не считаю, что ваш код может завершиться неудачно, как вы описываете.
Это приводит к двум гипотезам:
-
Код, который вы на самом деле выполняете, не идентичен коду в вашем вопросе (возможно, более ранняя или более поздняя версия?)
-
aSourceDictionary
на самом деле не словарь, а какая-то другая структура (например, список).
Ответ 3
В соответствии с вашим описанием вещи не складываются. Если aSourceDictionary
- словарь, тогда ваш цикл for должен работать правильно.
>>> source = {'a': [1, 2], 'b': [2, 3]}
>>> target = {}
>>> for key in source:
... target[key] = []
... target[key].extend(source[key])
...
>>> target
{'a': [1, 2], 'b': [2, 3]}
>>>
Ответ 4
Он отлично работает: http://codepad.org/5KgO0b1G,
ваша переменная aSourceDictionary
может иметь другой тип данных, чем dict
aSourceDictionary = { 'abc' : [1,2,3] , 'ccd' : [4,5] }
aTargetDictionary = {}
for aKey in aSourceDictionary:
aTargetDictionary[aKey] = []
aTargetDictionary[aKey].extend(aSourceDictionary[aKey])
print aTargetDictionary