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

4 Solutions collect form web for “Python dictionary: TypeError: unhashable type: 'list'”

Ошибка, которую вы указали, связана с тем, что в python ключи словаря должны быть неизменяемыми типами (если ключ может измениться, будут проблемы), а список – изменяемый тип.

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

Согласно документу python :

Единственными типами значений, которые не приемлемы в качестве ключей, являются значения, содержащие списки или словари или другие изменяемые типы, которые сравниваются по значению, а не по идентификатору объекта, и причина в том, что для эффективной реализации словарей требуется, чтобы хэш-значение ключа оставалось постоянным

Это действительно странно.

Если aSourceDictionary был словарем, я не считаю, что ваш код может потерпеть неудачу так, как вы описываете.

Это приводит к двум гипотезам:

  1. Код, который вы на самом деле выполняете, не идентичен коду в вашем вопросе (возможно, более ранняя или более поздняя версия?)

  2. aSourceDictionary на самом деле не является словарем, но является некоторой другой структурой (например, списком).

Согласно вашему описанию, все не складывается. Если 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]} >>> 

Он отлично работает: 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 
Python - лучший язык программирования в мире.