Es mēģinu iegūt failu, kas izskatās šādi.
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
```
Un izmantojiet vārdnīcu, lai izvades rezultāts izskatītos šādi
```
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
```
Tas ir tas, ko es esmu mēģinājis
```
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()
```
Es turpinu saņemt `TypeError: unhashable type: 'list'`. Es zinu, ka vārdnīcas atslēgas nevar būt saraksti, bet es mēģinu padarīt savu vērtību par sarakstu, nevis atslēgu. Man rodas jautājums, vai es kaut kur neesmu kļūdījies.
Kā norādīts citās atbildēs, kļūda ir saistīta ar k = list[0:j]
, kur jūsu atslēga ir pārvērsta sarakstā. Viena lieta, ko jūs varētu izmēģināt, ir pārstrādāt savu kodu, lai izmantotu split
funkcijas priekšrocības:
# Using with ensures that the file is properly closed when you're done
with open('filename.txt', 'rb') as f:
d = {}
# Here we use readlines() to split the file into a list where each element is a line
for line in f.readlines():
# Now we split the file on `x`, since the part before the x will be
# the key and the part after the value
line = line.split('x')
# Take the line parts and strip out the spaces, assigning them to the variables
# Once you get a bit more comfortable, this works as well:
# key, value = [x.strip() for x in line]
key = line[0].strip()
value = line[1].strip()
# Now we check if the dictionary contains the key; if so, append the new value,
# and if not, make a new list that contains the current value
# (For future reference, this is a great place for a defaultdict :)
if key in d:
d[key].append(value)
else:
d[key] = [value]
print d
# {'AAA': ['111', '112'], 'AAC': ['123'], 'AAB': ['111']}
Ņemiet vērā, ka, ja izmantojat Python 3.x, jums būs jāveic nelieli pielāgojumi, lai šī funkcija darbotos pareizi. Ja failu atverat ar rb
, jums būs jāizmanto line = line.split(b'x')
(kas nodrošina, ka baits tiek sadalīts ar pareizo virknes veidu). Jūs varat arī atvērt failu, izmantojot with open('filename.txt', 'rU') kā f:
(vai pat with open('filename.txt', 'r') kā f:
), un tas darbosies pareizi.
Jūs mēģināt izmantot k
(kas ir saraksts) kā atslēgu d
. Saraksti ir mainīgi, un tos nevar izmantot kā dict atslēgas.
Turklāt šīs rindas dēļ jūs nekad neinicializējat sarakstus vārdnīcā:
if k not in d == False:
Kam vajadzētu būt:
if k not in d == True:
Kam patiesībā vajadzētu būt:
if k not in d:
TypeError
rodas tāpēc, ka k
ir saraksts, jo tas ir izveidots, izmantojot cita saraksta šķēli ar rindu k = list[0:j]
. Iespējams, ka tam vajadzētu būt kaut kam līdzīgam k = ' '.join(list[0:j])
, lai tā vietā iegūtu virkni.
Turklāt jūsu if
apgalvojums ir nepareizs, kā norādīts Jesse's atbildē, un tam būtu jāskan šādi: Ja k nav d
vai Ja k nav d
(es dodu priekšroku pēdējam).
Jūs arī dzēšat vārdnīcu katrā iterācijā, jo for
cilpas iekšpusē ir d = {}
.
Ņemiet vērā, ka jums arī nevajadzētu izmantot list
vai file
kā mainīgo vārdus, jo jūs maskēsiet iebūvētos elementus.
Lūk, kā es pārrakstītu jūsu kodu:
d = {}
with open("filename.txt", "r") as input_file:
for line in input_file:
fields = line.split()
j = fields.index("x")
k = " ".join(fields[:j])
d.setdefault(k, []).append(" ".join(fields[j+1:]))
Iepriekš minētā dict.setdefault()
metode aizstāj if k not in d
loģiku no jūsu koda.