IN1000 høst2024
Introduksjon til objektorientert programmering (Python)
05.10: Sorter hund og person
Navn: sorter_navnefil.py, navn.txt
Teksten under er en liste over navn til personer og hunder. Linjene som starter med P inneholder et navn til en person, mens linjene som starter med H er for en hund. Kopier over listen til en fil du kaller navn.txt.
P Martin
H Trofast
H Tapper
H Rex
P Simen
P Elin
H Tara
P Svein
Skriv et program som leser inn navn.txt og sorterer navnene i to lister: personer
og hunder
. Til slutt skal listene skrives ut.
Det finnes mange måter å løse denne oppgaven på.
Løsning med split()
:
NB: Merk at dette ikke vil fungere hvis et navn inneholder et mellomrom
personer = []
hunder = []
fil = open("navn.txt", "r")
for linje in fil:
kolonner = linje.split()
if kolonner[0] == "H":
hunder.append(kolonner[1])
elif kolonner[0] == "P":
personer.append(kolonner[1])
else:
print("Feil i linjeformat:\n", linje)
fil.close()
print("Personer")
print(personer)
print("\nHunder")
print(hunder)
Løsning med slicing:
Husk at du kan bruke slicing til å ta utdrag fra en tekststreng. F.eks:
navn = "Ole Petter!"
print(navn[4:-1])
gir utskriften
Petter
Tallet 4 indikerer startposisjonen i strengen og -1 indikerer den nest-siste posisjonen (her er det indeks 9).
personer = []
hunder = []
fil = open("navn.txt", "r")
for linje in fil :
if linje[0] == "H":
hunder.append(linje[2:-1])
elif linje[0] == "P":
personer.append(linje[2:-1])
else:
print("Feil i linjeformat:\n", linje)
fil.close()
print("Personer")
print(personer)
print("\nHunder")
print(hunder)
05.11 En tabulær fil med karakterer
Filnavn: karakter.csv, sorter_etter_karakter.py
I denne øvelsen skal du lage et program som leser en fil med studentnavn og sine karakterer. Filen heter karakter.csv og er en tabulær fil med to kolonner som skal se slik ut:
Anna,C
Joakim,E
Louise,A
Lasse,F
Gry,B
Odd,D
Sven,D
Kaja,F
Ola,F
Ine,E
Vegard,A
Paal,C
a) Lag en funksjon sorter_etter_karakter()
som tar inn parameter filnavn
og leser hver linje i filen. Funksjonen skal:
- opprette en ordbok for å lagre informasjon over studentene og karakterene
- hente navn og karakter fra hver linje (uten linjeskrift-karakter) og lagre dem i ordbøken som bruker karakteren som nøkkelverdi og har en liste med navn som innholdsverdi.
- Hver gang du finner en karakter som ikke er en nøkkel i ordboken ennå, kan du legge det til. Hvis den allerede er i ordboken, legg til navnet i listen.
- returnere ordboken som ser slik ut:
{'C': ['Anna', 'Paal'], 'E': ['Joakim', 'Ine'], 'A': ['Louise', 'Vegard'], 'F': ['Lasse', 'Kaja', 'Ola'], 'B': ['Gry'], 'D': ['Odd', 'Sven']}
b) Lag en prosedyre skriv_ut_sortert()
som tar inn ordbøken laget av sorter_etter_karakter()
og skriver ut denne ordbøken sortert:
A : ['Louise', 'Vegard']
B : ['Gry']
C : ['Anna', 'Paal']
D : ['Odd', 'Sven']
E : ['Joakim', 'Ine']
F : ['Lasse', 'Kaja', 'Ola']
c) Lag en funksjon hent_vanligste_karakter()
som tar inn ordbøken og returnerer karakteren som de fleste studenter fikk. (Hint: bruk funksjonen len()
for å se hvor mange studenter fikk karakteren).
d) Kall hver funksjon og prosedyre for å sjekke at de fungerer.
a)
def sorter_etter_karakter(filnavn):
karakter_ordbok = {}
fil = open(filnavn, "r")
for linje in fil:
navn, karakter = linje.strip().split(",")
if karakter in karakter_ordbok:
karakter_ordbok[karakter].append(navn)
else:
karakter_ordbok[karakter] = [navn]
# Husk å lukke filen
fil.close()
return karakter_ordbok
b)
def skriv_ut_sortert(karakter_ordbok):
for karakter in sorted(karakter_ordbok.keys()):
print(karakter, ": ", karakter_ordbok[karakter])
c)
def hent_vanligste_karakter(karakter_ordbok):
vanligste_karakter = ""
antall_studenter = 0
for karakter in sorted(karakter_ordbok.keys()):
if len(karakter_ordbok[karakter]) > antall_studenter:
antall_studenter = len(karakter_ordbok[karakter])
vanligste_karakter = karakter
return vanligste_karakter
d) Husk å lagre karakter.csv i samme mappe som sorter_etter_karakter.py
karakter_ordbok = sorter_etter_karakter("karakter.csv")
skriv_ut_sortert(karakter_ordbok)
print("Vanligste karakter:", hent_vanligste_karakter(karakter_ordbok))
05.13 Maks tegn per linje
Filnavn: maks_tegn_per_linje.py
Dette er en fortsettelse av oppgave 05.07. Hvis du ikke har løst oppgave 05.07 ennå, kan du prøve det først.
I denne oppgaven skal du skrive en prosedyre som tar inn en tekst (string), et utdatafilnavn (string) og et maksimalt antall tegn (heltall) per linje. Prosedyren skal skrive teksten til utdatafilen slik at hver linje ikke inneholder mer enn det maksimale antallet tegn. I tillegg skal prosedyren passe på at ordene ikke deles på flere linjer, dvs. at et ord flyttes til en ny linje i stedet for å deles over to linjer. Bruk koden du skrev for oppgave 05.07 som utgangspunkt.
Hint
Denne gangen bør du ikke holde oversikt over antall skrevne ord, men antall skrevne tegn for en linje.
Eksempel:
- Teksten: "I denne oppgave skal du lage et program som tar inn en tekst og skriver den ut til en fil. I utdatafilen er det maksimalt antall ord som er tillatt per linje."
- Filnavn: "test.out"
- Maks antall tegn per linje: 20
Forventet resultat: test.out
I denne oppgave skal
du lage et program
som tar inn en tekst
og skriver den ut til
en fil. I utdatafilen
er det maksimalt
antall ord som er
tillatt per setning.
def format_text(tekst, filnavn, maks_tegn):
ordene = tekst.split()
fil = open(filnavn, "w")
teller = 0
for min_ord in ordene:
if teller + len(min_ord) > maks_tegn:
# Må starte ny linje
fil.write("\n")
teller = len(min_ord)
else:
# Husk at mellomrom også er et tegn
teller += len(min_ord) + 1
fil.write(min_ord)
fil.write(" ")
# Husk å lukke filen!
fil.close()
tekst = "I denne oppgave skal du lage et program som tar inn en tekst og skriver den ut til en fil. I utdatafilen er det maksimalt antall ord som er tillatt per setning."
format_text(tekst, "test.out", 20)