TypeError: 'set' object is not subscriptable

'Kirjasto'-koodini alkaa valmistua, mutta herjaa rivillä 41: TypeError: 'set' object is not subscriptable. Enkä saa sitä poistumaan millään. Osaako joku auttaa?



#_Tämä on Katjaanan sellainen harjoitus, joka myös tallentaa, jos osaan sen tehdä.

tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

#_Poistin alla olevat, sillä olivat kovakoodattuja.
#_List = [{"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
#_{"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
#_{"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
#_{"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}]

#_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
List = [{"kirja1", "kirjailija1", "jv1"
"kirja2", "kirjailija2", "jv2"
"kirja3", "kirjailija3", "jv3"}]

#_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
def lataaTiedot(tiedosto):
lista = []
with open(tiedosto, 'r') as tiedostoObjekti:
for rivi in tiedostoObjekti:
kirja = rivi.replace("\n","").split(',')
if len(kirja) == 3:
lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
return lista

#_Kirjat tulostetaan alla olevalla tavalla.
print(lataaTiedot("kirjasto.txt"))
[{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

#-----ALKAA Funktioiden esittely----------------------------------------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
#kun poistetaan kirjaa.

#Etsitään onko List:ssä kirjaa.
def onkoKirjaa(kirja):
for x in List:
if x["kirja"]==kirja: return True
return False

#Palautetaan kirja.
def getKirja(kirja):
for x in List:
if x["kirja"]==kirja: return x
return None

#-----LOPPUU Funktioiden esittely---------------------------------------

print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
"Uuden kirjan lisäys Kirjakauppaan:", "\n"
"Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
kirja = input("Kirjan nimi: ")
kirjailija = input("Kirjailijan nimi: ")
jv = input("Julkaisuvuosi: ")

#-----ALKAA Lisätään appendilla uusi kirja------------------------------

#Lisätään uusi tuote List:aan
uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
List.append(uusiKirja)

#-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
tiedosto.write(kirja "\n")
tiedosto.write(kirjailija "\n")
tiedosto.write(jv "\n")

tiedosto.close() #Tiedoston sulkeminen.

tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

while True:

print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

if valinta == "Poistu": #Ohjelmasta poistuminen.
break

elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
for x in List:
print(x["kirja"])
print(x["kirjailija"])
print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
print(getKirja(valinta))

#elif valinta == "Poista":
elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
print(getKirja(valinta)) #Palautetaan kirja.
elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
poistettava = input ("Minkä kirjan haluat poistaa? ")
for i in range(len(List)):
if List[i]['kirja'] == poistettava:
del List[i]
break

print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

else:

print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

tiedosto.close() #Suljetaan tiedosto.

0

192

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000

      Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

      Luetuimmat keskustelut

      1. Vuonna 2026 jää entistä vähemmän rahaa käteen palkansaajille

        Työttömyysvakuutusmaksu nousee 0,3 prosenttia. Työeläkemaksu nousee 7,15 prosentista 7,3 prosenttiin. Työmarkkinajärjest
        Maailman menoa
        63
        5940
      2. Yritystuet pois ja työeläkevaroilla maksettava valtion velka pois

        Nyt on teille kerrottu keino kuinka Suomen velkaongelmasta päästää eroon kertalaakista. Älkää saatanat enää minulle tul
        Maailman menoa
        113
        5256
      3. Suomen kansa puhunut: Purra huonoimpia ministereitä

        Kouluarvosanalla 6–, eli samaa tasoa mitä Purran oikeakin koulutodistus. Epäpätevyys on tullut huomattua Suomen talouden
        Maailman menoa
        366
        4066
      4. Ylen juttu sisäministeristä oli selvän tarkoitushakuinen

        haluttiin vielä vuoden loppuun saada joku "kohu". (Olisiko Yle tehnyt jutun jos sisäministerinä olisi esim. RKP:n, jota
        Maailman menoa
        142
        3299
      5. Suomalaista yrittäjää ei kommunistista erota

        Muualla maailmassa yrittäjät elävät asiakkaiden rahoilla, Suomessa palkansaajien maksamilla veroilla. Palkansaajahan ma
        Maailman menoa
        52
        2781
      6. 26
        2133
      7. Joulun ruokajonoissa entistä enemmän avuntarvitsijoita - Mitä ajatuksia tämä herättää?

        Räppärit Mikael Gabriel, VilleGalle ja Jare Brand jakoivat ruokaa ja pehmeitäkin paketteja vähävaraisille jouluaattoa ed
        Maailman menoa
        127
        2121
      8. Pyydän anteeksi etten osannut ratkaista

        Mitään muuta kuin lähtemällä. Et oikein tullut vastaan etkä kuunnellut. Tuntui että minun piti koittaa sopia ja sovitell
        Ikävä
        85
        1929
      9. Ulkoministeriön konsulipäällikkö arvostelee rajusti Haavistoa: "Täällä on pelon ilmapiiri"

        "– Täällä on ministerin toimien takia aivan selvästi pelon ilmapiiri. Jos sellaisen annetaan pesiytyä virkamieskulttuuri
        Maailman menoa
        10
        1927
      10. Mikä on pahinta

        Mitä kaivattusi voisi tehdä sinulle?
        Ikävä
        249
        1896
      Aihe