Mai mult
Python: TypeError: unhashable type: 'list'
I'm încearcă să ia un fișier care arată ca aceasta
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
Și folosiți un dicționar pentru ca rezultatul să arate astfel
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
Aceasta este ceea ce am încercat
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()
Continui să primesc un TypeError: unhashable type: 'list'
. Știu că cheile dintr-un dicționar nu pot fi liste, dar eu încerc să transform valoarea mea într-o listă, nu în cheie. Mă întreb dacă nu cumva am făcut o greșeală undeva.
74
3
Așa cum au indicat și celelalte răspunsuri, eroarea se datorează
k = list[0:j]
, unde cheia este convertită într-o listă. Un lucru pe care l-ați putea încerca este să vă refaceți codul pentru a profita de funcțiasplit
:Rețineți că, dacă utilizați Python 3.x, va trebui să faceți o mică ajustare pentru a o face să funcționeze corect. Dacă deschideți fișierul cu
rb
, va trebui să folosițiline = line.split(b'x')
(care se asigură că împărțiți octetul cu tipul corect de șir de caractere). Puteți, de asemenea, să deschideți fișierul folosindwith open('nume fișier.txt', 'rU') ca f:
(sau chiarwith open('nume fișier.txt', 'r') ca f:
) și ar trebui să funcționeze bine.Încerci să folosești
k
(care este o listă) ca o cheie pentrud
. Listele sunt mutabile și nu pot fi folosite ca chei dict.De asemenea, nu inițializați niciodată listele din dicționar, din cauza acestei linii:
Care ar trebui să fie:
Care ar trebui să fie de fapt:
Eroarea
TypeError
se întâmplă deoarecek
este o listă, deoarece este creată folosind o felie dintr-o altă listă cu liniak = list[0:j]
. Probabil că ar trebui să fie ceva de genulk = ' '.join(list[0:j])
, astfel încât să aveți în schimb un șir de caractere.În plus, afirmația dvs.
if
este incorectă, așa cum a fost observat de răspunsul lui Jesse's, care ar trebui să fieif k not in d
sauif not k in d
(îl prefer pe cel din urmă).De asemenea, vă ștergeți dicționarul la fiecare iterație, deoarece aveți
d = {}
în interiorul bucleifor
.Rețineți că nu ar trebui să folosiți
list
saufile
ca nume de variabile, deoarece veți masca elementele construite.Iată cum aș rescrie eu codul dumneavoastră:
Metoda
dict.setdefault()
de mai sus înlocuiește logicaif k not in d
din codul dumneavoastră.