Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Filtrering:

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)