Guidad övning
Kap 2.7 – Övning: Bibliotekskatalog
Bygg steg för steg en bibliotekskatalog som förberedelse inför Inlämningsuppgift 2.
Mål med lektionen
När du har arbetat klart med denna lektion ska du:
- Kunna lagra och organisera data med hjälp av listor, tuples eller dictionaries.
- Använda kontrollstrukturer för att skapa enkel programlogik.
- Kombinera olika koddelar till ett fungerande program.
- Planera, strukturera och reflektera över din egen lösning.
Så här lär du dig bäst
Börja med att tänka igenom vad programmet ska göra. Skapa en enkel plan i punktform eller pseudokod. Skriv koden steg för steg och testa ofta. Reflektera över hur du kan förenkla din lösning och återanvända kod.
Det här är en förberedande övning. När den fungerar ska du använda idéerna, men skriva en egen lösning till Inlämningsuppgift 2, som har andra data och ytterligare krav.
Uppgift: Bibliotekskatalog
Skapa ett program där användaren kan:
- Lägga till böcker med titel, författare och år.
- Söka efter en bok utifrån titel eller författare.
- Skriva ut hela katalogen i alfabetisk ordning efter titel.
Det här bygger på tidigare kapitel
Uppgiften ska kunna lösas med sådant som redan har gåtts igenom:
- Kap 1.3: funktioner och tydlig kodstruktur.
- Kap 1.4: villkor med
if,elif,elseoch logiska operatorer somor. - Kap 1.5: loopar och menyprogram med
while. - Kap 1.6: enkel felhantering om du vill kontrollera årtal.
- Kap 2.2: listor och
append(). - Kap 2.3: sökning och sortering med
sorted(). - Kap 2.4: dictionaries.
- Kap 2.5: planering, pseudokod och testfall.
- Kap 2.6: problemlösning med listor och dictionaries.
Du behöver inte spara böckerna till en fil i den här uppgiften. Datan får försvinna när programmet avslutas.
Förslag på struktur
Pseudokod:
Skapa tom lista för böcker som dictionaries
Meny: Lägg till / Sök / Visa alla / Avsluta
IF val == Lägg till:
Läs in titel, författare, år
Skapa dictionary och lägg till i listan
IF val == Sök:
Läs in sökord
Skriv ut alla böcker som matchar titel eller författare
IF val == Visa alla:
Sortera listan och skriv ut
Innan hela programmet: förstå byggstenarna
Bibliotekskatalogen består av flera mindre delar. Läs dessa exempel först. Då blir den fullständiga koden längre ner mycket lättare att förstå.
Del 1: En bok som dictionary
En bok har flera egenskaper: titel, författare och år. Därför passar en dictionary bra. Varje egenskap får en tydlig nyckel.
book = {
"title": "1984",
"author": "George Orwell",
"year": "1949"
}
print(book["title"]) # 1984
print(book["author"]) # George Orwell
Här betyder book["title"]: hämta värdet som hör till nyckeln
"title".
Del 2: En katalog som lista med dictionaries
Katalogen ska kunna innehålla flera böcker. Därför använder vi en lista. Varje element i listan är en dictionary som beskriver en bok.
catalog = []
book = {"title": "1984", "author": "George Orwell", "year": "1949"}
catalog.append(book)
print(catalog)
Efter catalog.append(book) ligger boken sparad i listan. Det är alltså inte bara en
vanlig lista med text, utan en lista med mer strukturerade objekt.
Del 3: Göra en funktion som lägger till en bok
När samma arbetsmoment har ett tydligt ansvar kan det bli en egen funktion. Funktionen
add_book() tar emot listan catalog och lägger till en ny bok i den.
def add_book(catalog):
title = input("Titel: ")
author = input("Författare: ")
year = input("År: ")
book = {"title": title, "author": author, "year": year}
catalog.append(book)
title,authorochyearhämtas från användaren.- Värdena samlas i en dictionary.
- Dictionaryn läggs till i listan med
append().
Del 4: Söka med in och lower()
När användaren söker ska programmet hitta böcker även om användaren skriver med små bokstäver.
Därför används lower(), som gör texten till små bokstäver.
title = "Bröderna Lejonhjärta"
query = "lejon"
if query in title.lower():
print("Träff!")
query in title.lower() betyder: finns sökordet någonstans i titeln?
Del 5: Söka med en vanlig loop
Innan vi använder en kortare lösning är det bra att se den tydliga varianten med en vanlig
for-loop.
found = []
for book in catalog:
if query in book["title"].lower() or query in book["author"].lower():
found.append(book)
found = []skapar en tom lista för böcker som matchar sökningen.for book in cataloggår igenom en bok i taget.if-satsen kontrollerar både titel och författare.- Om boken matchar läggs den till i
found.
Del 6: Kortare sökning, om du vill
Du kan lösa uppgiften med den vanliga loopen i del 5. Om du vill kan du också använda list comprehension, som är ett kortare sätt att skapa en ny lista från en befintlig lista. Det är inte ett krav i övningen.
found = [
book for book in catalog
if query in book["title"].lower() or query in book["author"].lower()
]
Läs raden så här:
- Skapa en ny lista som heter
found. - Gå igenom varje
bookicatalog. - Ta bara med boken om sökordet finns i titeln eller författaren.
Del 7: Skriva ut böcker med f-string
När en bok ska visas hämtas värdena från dictionaryn och sätts in i en text.
for book in found:
print(f"{book['title']} av {book['author']} ({book['year']})")
Det här kan till exempel skriva ut:
1984 av George Orwell (1949)
Del 8: Sortera listan efter titel
Katalogen ska visas i alfabetisk ordning efter titel. Då används sorted() tillsammans
med key.
sorted_books = sorted(catalog, key=lambda x: x["title"])
Här betyder x en bok i listan. Eftersom varje bok är en dictionary betyder
x["title"] bokens titel. Sorteringen använder alltså titeln som sorteringsvärde.
Del 9: Menyn som styr programmet
Huvudprogrammet använder en meny med while True. Loopen fortsätter tills användaren
väljer att avsluta.
while True:
print("1. Lägg till bok")
print("2. Sök bok")
print("3. Visa alla")
print("4. Avsluta")
choice = input("Välj: ")
if choice == "1":
add_book(catalog)
elif choice == "4":
break
Menyn kopplar ihop de mindre funktionerna till ett helt program.
Kodexempel
def add_book(catalog):
title = input("Titel: ")
author = input("Författare: ")
year = input("År: ")
book = {"title": title, "author": author, "year": year}
catalog.append(book)
def search_books(catalog):
query = input("Sök titel eller författare: ").lower()
found = []
for book in catalog:
if query in book["title"].lower() or query in book["author"].lower():
found.append(book)
for book in found:
print(f"{book['title']} av {book['author']} ({book['year']})")
def print_catalog(catalog):
sorted_books = sorted(catalog, key=lambda x: x["title"])
for book in sorted_books:
print(f"{book['title']} av {book['author']} ({book['year']})")
def main():
catalog = []
while True:
print("\n1. Lägg till bok\n2. Sök bok\n3. Visa alla\n4. Avsluta")
choice = input("Välj: ")
if choice == "1":
add_book(catalog)
elif choice == "2":
search_books(catalog)
elif choice == "3":
print_catalog(catalog)
elif choice == "4":
break
else:
print("Ogiltigt val.")
main()
Interaktiv övning: bibliotekskatalog
Testa uppgiften steg för steg. Lägg till böcker som dictionaries, sök efter titel eller författare och visa hela katalogen sorterad efter titel.
Prova till exempel att:
- lägga till
1984,George Orwell,1949 - lägga till
Bröderna Lejonhjärta,Astrid Lindgren,1973 - söka efter
orwellellerastrid - visa alla och se att böckerna sorteras alfabetiskt efter titel
Programmering 2-koppling: katalogen kombinerar en lista
med dictionaries, sökning med in, sortering med sorted() och en meny
med villkor.
Utmaning
- Visa ett meddelande om sökningen inte hittar någon bok.
- Hindra dubbletter: kontrollera om en bok med samma titel redan finns innan den läggs till.
- Lägg till ett menyval som tar bort en bok utifrån titel.
- Svårare extrautmaning: lägg till ett menyval som ändrar årtal på en bok.
Öva själv
Skapa en Python-fil som heter kap2-7-bibliotek.py. Filen ska innehålla:
- en kort plan som kommentarer högst upp: input, bearbetning, output, datastruktur och funktioner,
- en lista som lagrar böcker,
- böcker sparade som dictionaries med titel, författare och år,
- en meny där användaren kan lägga till bok, söka bok, visa alla böcker och avsluta,
- minst tre egna funktioner, till exempel
add_book(),search_books()ochprint_catalog(), - sortering efter titel när hela katalogen visas,
- minst tre testfall som kommentarer längst ner i filen.
Testfall att prova
| Test | Vad du ska kontrollera |
|---|---|
| Lägg till två böcker och visa alla | Böckerna visas i alfabetisk ordning efter titel. |
| Sök på en del av en titel | Rätt bok visas även om du bara skriver en del av titeln. |
| Sök på en författare | Alla böcker av den författaren visas. |
| Sök på något som inte finns | Programmet bör visa ett tydligt meddelande. |
Extrautmaningarna är frivilliga. Bygg hellre ett tydligt fungerande grundprogram än ett större program där grundkraven inte fungerar.
När du har försökt själv kan du ladda ner ett lösningsförslag: kap2-7-bibliotek-losningsforslag.py
Lösningsförslaget gäller bibliotekskatalogen. Inlämningsuppgift 2 kräver bland annat kontroll av unika e-postadresser och en funktion för att ta bort användare.
Reflektion
- Hur valde du att strukturera datan? Varför?
- Hur kan du utveckla programmet för att bli mer användarvänligt?
- Vilka delar var svårast och varför?