it-swarm-pt.tech

Python dictionary: TypeError: tipo não pesquisável: 'list'

Estou tendo problemas em preencher um dicionário python a partir de outro dicionário.

Vamos supor que o dicionário "fonte" tenha string como chaves e tenha uma lista de objetos personalizados por valor.

Eu estou criando o meu dicionário de destino exatamente como eu tenho criado o meu dicionário "fonte" como é possível que isso não está funcionando?

Eu recebo

TypeError: unhashable type: 'list'

Código:

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

O erro está nesta linha: aTargetDictionary[aKey] = []

50
codeJack

O erro que você deu é devido ao fato de que, em python, as chaves de dicionário devem ser tipos imutáveis ​​(se a chave puder mudar, haverá problemas), e list é um tipo mutável.

Seu erro diz que você tenta usar uma lista como chave do dicionário, você terá que mudar sua lista em tuplas se você quiser colocá-las como chaves no seu dicionário.

De acordo com o pythondoc :

Os únicos tipos de valores não aceitáveis ​​como chaves são valores que contêm listas ou dicionários ou outros tipos mutáveis ​​que são comparados por valor em vez de por identidade de objeto, pois a implementação eficiente de dicionários exige que o valor de hash de uma chave permaneça constante

45
Cédric Julien

Isso é de fato bastante estranho.

Se aSourceDictionary for um dicionário, não acredito que seja possível que seu código falhe da maneira descrita por você.

Isso leva a duas hipóteses:

  1. O código que você está executando não é idêntico ao código da sua pergunta (talvez uma versão anterior ou posterior?)

  2. aSourceDictionary não é, na verdade, um dicionário, mas alguma outra estrutura (por exemplo, uma lista).

7
NPE

De acordo com sua descrição, as coisas não se somam. Se aSourceDictionary for um dicionário, então o loop for deve funcionar corretamente.

>>> 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]}
>>> 
5
ronakg

Ele funciona bem: http://codepad.org/5KgO0b1G , sua variável aSourceDictionary pode ter outro tipo de dados do que o dict

aSourceDictionary = { 'abc' : [1,2,3] , 'ccd' : [4,5] }
aTargetDictionary = {}
for aKey in aSourceDictionary:
        aTargetDictionary[aKey] = []
        aTargetDictionary[aKey].extend(aSourceDictionary[aKey])
print aTargetDictionary
2
DhruvPathak