Kap 2.6
Problemlösning med listor
Vi bygger större program genom att kombinera listor, funktioner, loopar och villkor.
Mål
Efter lektionen ska du kunna...
- använda listor i sammansatta uppgifter
- kombinera listor med funktioner och loopar
- välja hur varje element i listan ska lagras
- testa vanliga fall och kantfall
Scenario
Poänghantering i ett spel
- ta emot namn och poäng
- spara flera resultat i en lista
- sortera resultaten efter poäng
- skriva ut en topplista
Plan
Pseudokod först
Skapa en tom lista
WHILE användaren vill fortsätta:
Läs in namn och poäng
Lägg till resultatet i listan
Fråga om användaren vill fortsätta
Sortera listan efter poäng
Skriv ut topplistan
Datastruktur
Vad är ett element?
scores = [
("Anna", 120),
("Erik", 95),
("Sara", 150)
]
Listan innehåller flera resultat.
Varje tuple kopplar ihop namn och poäng.
Alternativ
Tuple eller dictionary?
("Anna", 120)
Tuple passar när varje resultat bara har två fasta värden.
{"name": "Anna", "points": 120}
Dictionary blir tydligare om resultatet ska byggas ut senare.
Funktion
Lägg till resultat
def add_score(scores):
name = input("Ange namn: ")
try:
points = int(input("Ange poäng: "))
scores.append((name, points))
except ValueError:
print("Du måste ange ett heltal.")
Stegvis
Vad händer i funktionen?
namefår spelarens namn.int(input(...))försöker läsa poäng som heltal.append()lägger till en tuple i listan.except ValueErrorfångar fel poänginmatning.
Sortering
Först: enkel sortering
numbers = [5, 2, 9, 1]
numbers.sort()
print(numbers)
[1, 2, 5, 9]
Här vet Python direkt hur talen ska sorteras.
Sortering
Men vad ska Python sortera på?
scores = [
("Anna", 120),
("Erik", 95),
("Sara", 150)
]
Varje element innehåller två delar.
Ska listan sorteras efter namn eller poäng?
Tuple
Index visar vilken del
result = ("Anna", 120)
result[0] # "Anna"
result[1] # 120
0 är namnet.
1 är poängen.
Key
key väljer sorteringsvärde
def get_points(result):
return result[1]
scores.sort(key=get_points)
För varje tuple hämtar funktionen poängen.
Python använder poängen när listan sorteras.
Lambda
En kort funktion direkt i raden
def get_points(result):
return result[1]
Detta är en vanlig funktion.
lambda result: result[1]
Detta är samma idé, men kortare.
Lambda
Läs raden i delar
scores.sort(key=lambda result: result[1], reverse=True)
scores.sort(...)sorterar listan.key=...säger vad Python ska sortera på.lambda result: result[1]hämtar poängen.reverse=Trueger högsta poängen först.
Sortering
I programmet
def print_high_scores(scores):
scores.sort(key=lambda result: result[1], reverse=True)
print("\nTopplista:")
for name, points in scores:
print(f"{name}: {points}")
Exempel
Före och efter sortering
[("Anna", 120), ("Erik", 95), ("Sara", 150)]
Detta är ordningen som resultaten matades in i.
[("Sara", 150), ("Anna", 120), ("Erik", 95)]
Efter sortering kommer högsta poängen först.
Huvudprogram
Loopen styr flödet
def main():
scores = []
while True:
add_score(scores)
cont = input("Fler resultat? (j/n): ")
if cont.lower() != "j":
break
print_high_scores(scores)
Koppling
Delarna samarbetar
- Listan sparar alla resultat.
- Tuplen håller ihop namn och poäng.
- Funktioner delar upp ansvaret.
- Loopen låter användaren lägga till flera resultat.
- Villkor avgör när programmet ska avslutas.
Testning
Testa även kantfall
Vanligt fall:
Anna 120, Erik 95, Sara 150
Förväntat: Sara visas först
Fel poäng:
Anna abc
Förväntat: felmeddelande
Tom lista:
Användaren avslutar direkt
Förväntat: programmet hanterar det tydligt
Utveckling
Bygg vidare
- visa bara de tre bästa resultaten
- kontrollera dubbletter
- ta bort en spelare
- spara topplistan till fil senare
Öva själv
Topplista
- Skriv först en plan.
- Bygg ett menyprogram.
- Låt användaren lägga till resultat.
- Visa hela topplistan.
- Visa bara de tre bästa resultaten.
Sammanfattning
Kom ihåg
- Fråga alltid vad ett element i listan är.
- Välj tuple eller dictionary efter behov.
append()lägger till nya resultat.sort(key=...)kan sortera efter en del av varje element.- Kantfall visar om programmet är robust.