Pieni Python-ongelma, johon toivon helposti ymmärrettävää ratkaisua

Liittynyt
02.05.2020
Viestejä
32
Mietin, että onko kamalan hankalalasti toteutettavissa sellainen, että 'sanon asiakkaalle' tuossa alla olevan Karkkikauppa-koodini alussa, että jos et halua lisätä nyt karkkia, niin laita x-merkit pyydettyihin kohtiin (karkin nimi ja valmistajan nimi) ja pääset jatkamaan seuraavaan valikkoon. Sen jälkeen koodi hoitaisi sen, että ne x-merkit eivät tallentuisi Karkkikauppaani? Nythän ne menevät ja ne voi toki poistaa Poista-käskyllä, mutta minusta olisi hauskaa, että koodi 'ymmärtäisi' x-merkin olevan epäkelpo... Alla siis muuten toimiva koodi. Toivoisin, että joku keksisi minulle HELPON ratkaisun tuohon ongelmaan, eli niinkuin koodista näkee, en osaa vaikeita asioita, vaan aivan vasta perusjuttuja. Tiedän kyllä, että tässä Karkkikaupassa voi lisätä sellaisiakin karkkeja, joita jo on, mutta se ei ole ongelma. Se, miten saatiinkaan aikaan se, että karkin voi syöttää isoin, tai pienin kirjaimin ja ei tule herjaa, olen myös unohtanut...


List = [{"tuote":"Fasu", "valmistaja":"Fazer"},{"tuote":"Suukko", "valmistaja":"Brunberg"},{"tuote":"Lakupala", "valmistaja":"Panda"}]

#Etsitään onko List:ssä tuotetta tuote
def onkoTuotetta(tuote):
for x in List:
if x["tuote"]==tuote: return True
return False

#Etsitään tuote List:stä ja palautetaan se
def getTuote(tuote):
for x in List:
if x["tuote"]==tuote: return x
return None

print("Uuden tuotteen lisäys karkkikauppaan. Anna pyydetyt tiedot:")
tuote = input("Karkin nimi: ")
valmistaja = input("Valmistajan nimi: ")

#Lisätään uusi tuote List:aan
uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}
List.append(uusiTuote)

tiedosto = open("karkkikauppa.txt", "w")

tiedosto.write(tuote + "\n")
tiedosto.write(valmistaja + "\n")
#tiedosto.write(parasta_ennen_pvm + "\n")

tiedosto.close()

tiedosto = open("karkkikauppa.txt", "r")

while True:

print("Anna valitsemasi karkin nimi, niin tulostan sen, jos se löytyy karkkikaupasta.")
print("Komennolla Kaikki tulostetaan kaikki karkkikaupan karkit.")
print("Komennolla Poista poistetaan valitsemasi karkkikaupan karkki.")
print("Komennolla Poistu, tämä ohjelma loppuu.")

valinta = input()

if valinta == "Poistu":
break

elif valinta == "Kaikki":
for x in List:
print(x["tuote"])
print(x["valmistaja"], "\n")

elif onkoTuotetta(valinta):
print(getTuote(valinta))

elif valinta == "Poista":
poistettava = input ("Minkä karkin haluat poistaa? ")
for i in range(len(List)):
if List['tuote'] == poistettava:
del List
break

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

else:

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

tiedosto.close() #Suljetaan tiedosto.
 
Suosittelen muuten käyttämään koodielementtiä, jos lisää viestiin koodia. Nythän tuossa ei sitä ole käytetty, joten sisennykset ovat ihan väärin, mikä hankaloittaa koodin lukemista aika tuntuvasti. Koodielementin saa lisättyä viestin kirjoituksen yhteydessä ...-valikosta.

x-merkit saanee käsiteltyä esim. lisäämällä sopivaan kohtaan if tuote != "x" and valmistaja != "x" ja kaveriksi tarvittaville muille jutuille sopivat sisennykset.

Merkkijonojen vertailu kirjainkoosta välittämättä ei ihan suoraan onnistu. Sen sijaan niin onnistuu, että muuttaa vertailtavat merkkijonot samaan kirjainkokoon ja vertailee sitten niitä keskenään. Tähän löytyy uudemmista Python-versioista suoraan casefold-metodi, kun taas vanhemmissa voi käyttää joko lower- tai upper-metodia. Esim. "KISSA".casefold() == "kissa".casefold() on tosi. Jos casefold ei ole käytettävissä, lower- ja upper-metodeja voi käyttää täsmälleen samalla tavalla.
 
Koodi:
List = [{"tuote":"Fasu", "valmistaja":"Fazer"},{"tuote":"Suukko", "valmistaja":"Brunberg"},{"tuote":"Lakupala", "valmistaja":"Panda"}]

#Etsitään onko List:ssä tuotetta tuote
def onkoTuotetta(tuote):
    for x in List:
        if x["tuote"]==tuote: return True
    return False

#Etsitään tuote List:stä ja palautetaan se
def getTuote(tuote):
    for x in List:
        if x["tuote"]==tuote: return x
    return None

print("Uuden tuotteen lisäys karkkikauppaan. Anna pyydetyt tiedot:")
tuote = input("Karkin nimi: ")
valmistaja = input("Valmistajan nimi: ")

#Lisätään uusi tuote List:aan
uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}
List.append(uusiTuote)

tiedosto = open("karkkikauppa.txt", "w")

tiedosto.write(tuote + "\n")
tiedosto.write(valmistaja + "\n")
#tiedosto.write(parasta_ennen_pvm + "\n")

tiedosto.close()

tiedosto = open("karkkikauppa.txt", "r")
 
while True:
    
    print("Anna valitsemasi karkin nimi, niin tulostan sen, jos se löytyy karkkikaupasta.")
    print("Komennolla Kaikki tulostetaan kaikki karkkikaupan karkit.")
    print("Komennolla Poista poistetaan valitsemasi karkkikaupan karkki.")
    print("Komennolla Poistu, tämä ohjelma loppuu.")
    
    valinta = input()
    
    if valinta == "Poistu":
        break

    elif valinta == "Kaikki":
        for x in List:
            print(x["tuote"])
            print(x["valmistaja"], "\n")

    elif onkoTuotetta(valinta):
        print(getTuote(valinta))
 
    elif valinta == "Poista":
      poistettava = input ("Minkä karkin haluat poistaa? ")
      for i in range(len(List)):
        if List[i]['tuote'] == poistettava:
          del List[i]
          break

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

    else:

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

tiedosto.close() #Suljetaan tiedosto.
 
Suosittelen muuten käyttämään koodielementtiä, jos lisää viestiin koodia. Nythän tuossa ei sitä ole käytetty, joten sisennykset ovat ihan väärin, mikä hankaloittaa koodin lukemista aika tuntuvasti. Koodielementin saa lisättyä viestin kirjoituksen yhteydessä ...-valikosta.

x-merkit saanee käsiteltyä esim. lisäämällä sopivaan kohtaan if tuote != "x" and valmistaja != "x" ja kaveriksi tarvittaville muille jutuille sopivat sisennykset.

Merkkijonojen vertailu kirjainkoosta välittämättä ei ihan suoraan onnistu. Sen sijaan niin onnistuu, että muuttaa vertailtavat merkkijonot samaan kirjainkokoon ja vertailee sitten niitä keskenään. Tähän löytyy uudemmista Python-versioista suoraan casefold-metodi, kun taas vanhemmissa voi käyttää joko lower- tai upper-metodia. Esim. "KISSA".casefold() == "kissa".casefold() on tosi. Jos casefold ei ole käytettävissä, lower- ja upper-metodeja voi käyttää täsmälleen samalla tavalla.



No tuo koodielementti oli kieltämättä hyvä vinkki, nyt se on korjattu! :)
 
Suosittelen muuten käyttämään koodielementtiä, jos lisää viestiin koodia. Nythän tuossa ei sitä ole käytetty, joten sisennykset ovat ihan väärin, mikä hankaloittaa koodin lukemista aika tuntuvasti. Koodielementin saa lisättyä viestin kirjoituksen yhteydessä ...-valikosta.

x-merkit saanee käsiteltyä esim. lisäämällä sopivaan kohtaan if tuote != "x" and valmistaja != "x" ja kaveriksi tarvittaville muille jutuille sopivat sisennykset.

Merkkijonojen vertailu kirjainkoosta välittämättä ei ihan suoraan onnistu. Sen sijaan niin onnistuu, että muuttaa vertailtavat merkkijonot samaan kirjainkokoon ja vertailee sitten niitä keskenään. Tähän löytyy uudemmista Python-versioista suoraan casefold-metodi, kun taas vanhemmissa voi käyttää joko lower- tai upper-metodia. Esim. "KISSA".casefold() == "kissa".casefold() on tosi. Jos casefold ei ole käytettävissä, lower- ja upper-metodeja voi käyttää täsmälleen samalla tavalla.


Mutta tämä: if tuote != "x" and valmistaja != "x"
En saa sitä oikeaan kohtaan ja vaihoin x:n tilalle muitakin vaihtoehtoja, kun ajattelin, että se x ei ehkä olekaan paras valinta, mutta ei se ongelma ollut siinä...
 
Mutta tämä: if tuote != "x" and valmistaja != "x"
En saa sitä oikeaan kohtaan ja vaihoin x:n tilalle muitakin vaihtoehtoja, kun ajattelin, että se x ei ehkä olekaan paras valinta, mutta ei se ongelma ollut siinä...
Tässä kohdassa lisäät karkkikauppaan uusia tuotteita:
Python:
#Lisätään uusi tuote List:aan
uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}
List.append(uusiTuote)
Joten... haluat varmastikin tehdä juuri tämän kohdan vain, jos käyttäjä on antanut jotain muuta kuin x:ää. Eikös näin? Toisin sanottuna tämä lienee se kohta, johon haluat tuon if-lauseen. Pythonin kanssa pitää toki muistaa sopivat sisennykset, että if-lause kohdistuu oikeisiin riveihin.
 
Sitten vielä. Olen nyt miettinyt tuota, että jos asiakas kirjoittaakin pienellä kirjaimella vaikka: poistu, niin koodi ei ymmärrä sitä samaksi, kuin Poistu. Olen yrittänyt capitalize:a laittaa eri tavoin koodiin tuloksetta..., eikös se tehdä sillä?


Koodi:
valinta = input()
    
    if valinta == "Poistu": 
        break

    elif valinta == "Kaikki": 
        for x in List:
            print(x["tuote"])
            print(x["valmistaja"], "\n") 

    elif onkoTuotetta(valinta): 
        print(getTuote(valinta))
 
    elif valinta == "Poista":
      poistettava = input ("Minkä karkin haluat poistaa? ")
      for i in range(len(List)):
        if List[i]['tuote'] == poistettava:
          del List[i]
          break

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

    else:

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

Statistiikka

Viestiketjuista
261 179
Viestejä
4 531 305
Jäsenet
74 771
Uusin jäsen
Salaliittoteoreetikko

Hinta.fi

Back
Ylös Bottom