Mais
Python: TypeError: tipo não chicotável: 'list'
I'estou tentando pegar um arquivo que se parece com este "ninguém AAA x 111 AAB x 111 AAA x 112 AAC x 123 ...
E use um dicionário para que a saída fique assim.
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
Isto é o que a I'já tentei
file = open("filename.txt", "r") readline = file.readline().rstrip() while readline!= "": list = [] list = readline.split(" ") j = list.index("x") k = list[0:j] v = list[j + 1:] d = {} if k not in d == False: d[k] = [] d[k].append(v) readline = file.readline().rstrip()
Eu continuo recebendo um `TypeError: unhashable type: 'list'`. Eu sei que chaves em um dicionário podem't ser listas, mas eu'estou tentando fazer meu valor em uma lista, não a chave. I'estou me perguntando se eu cometi um erro em algum lugar.
74
3
Como indicado pelas outras respostas, o erro é devido a
k = list[0:j]
, onde sua chave é convertida em uma lista. Uma coisa que você poderia tentar é refazer seu código para aproveitar a função `split':Note que se você estiver usando o Python 3.x, você'terá que fazer um pequeno ajuste para que ele funcione corretamente. Se você abrir o arquivo com
rb
, você'precisará utilizarline = line.split(b'x')
(o que garante que você está dividindo o byte com o tipo apropriado de string). Você também pode abrir o arquivo utilizandowith open('filename.txt', 'rU') como f:
(ou mesmowith open('filename.txt', 'r') como f:
) e deve funcionar bem.Você'está tentando usar
k
(que é uma lista) como uma chave parad
. Lists are mutable and can't be used as dict keys.Além disso, você'nunca está inicializando as listas no dicionário, por causa desta linha:
O que deveria ser:
O que na verdade deveria ser:
O
TypeError' está acontecendo porque
k' é uma lista, já que é criado utilizando uma fatia de outra lista com a linhak = list[0:j]
. Isto provavelmente deve ser algo comok = ' '.join(list[0:j])
, então você tem uma string no lugar.Além disso, a sua declaração 'se' está incorreta, como notado pela resposta de Jesse's, que deve ler-se 'se k não em d' ou 'se não k em d' (eu prefiro a última).
Você também está limpando seu dicionário em cada iteração, já que você tem
d = {}
dentro do seu loop `for'.Note que você também não deve estar utilizando
list
oufile
como nomes de variáveis, já que você estará mascarando builtins.Aqui está como eu reescreveria o seu código:
O método
dict.setdefault()
acima substitui o métodoif k not in d
logic do seu código.