Словарь Python: TypeError: unhashable тип: 'list' - PullRequest
50 голосов
/ 16 декабря 2011

У меня проблемы с заполнением словаря Python, начиная с другого словаря.

Предположим, что словарь «источника» имеет строку в качестве ключей и содержит список пользовательских объектов для каждого значения.

Я создаю свой целевой словарь точно так же, как я создавал свой «исходный» словарь. Как это возможно, это не работает?

Я получаю

TypeError: unhashable type: 'list'

Код:

aTargetDictionary = {}
for aKey in aSourceDictionary:
    aTargetDictionary[aKey] = []
    aTargetDictionary[aKey].extend(aSourceDictionary[aKey])

Ошибка в этой строке: aTargetDictionary[aKey] = []

Ответы [ 4 ]

45 голосов
/ 16 декабря 2011

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

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

Согласно the python doc :

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

7 голосов
/ 16 декабря 2011

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

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

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

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

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

5 голосов
/ 16 декабря 2011

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

Работает нормально: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...