Подтвердить что ты не робот

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] = []

4b9b3361

Ответ 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