# Oppdatert 19. mars 2025 def vent(): input("\nTast enter for ? fortsette: ") class Kommune: def __init__(self, nr, nvn): self._nummer = nr # instansvariabel for kommunenummer self._navn = nvn # instansvariabel for kommunenavn def nummer(self): return self._nummer def navn(self): return self._navn # Kan jo hende vi f?r bruk for disse hvis en kommune endrer # navn eller nummer: def sett_nummer(self, nr): self._nummer = nr def sett_navn(self, n): self._navn = n class Fylke: def __init__(self, fnr, fylkesnavn): self._navn = fylkesnavn self._nr = fnr def sett_nummer(self, nr): self._nr = nr def sett_navn(self, n): self._navn = n def navn(self): return self._navn def nummer(self): return self._nr troms = Fylke("trrr" + "oms", 25 - 9) print(troms) print(troms.navn(), troms.nummer()) vent() troms.sett_navn("Troms fylke") # troms._navn = "Troms fylke" print(troms.navn(), troms.nummer()) vent() nyttfylke = Fylke("Nord " + "Tr?ndelag", '45') k = Kommune('5618','M?s?y') # Denne prosedyren/funksjonen leser inn en fil og returnerer innholdet # som ei liste som inneholder like mange lister som linjer i filen # Hver indre liste inneholder ei og ei linje fra filen splittet # i biter mellom hver forekomst av tegnet "\t" (tabulator) def les_fil_returner_tabell(filnavn): # parameteren filnavn m? inneholde navnet p? filen det skal leses fra liste = [] # lista som skal inneholde det som skal returneres til slutt fil = open(filnavn) for linje in fil: linje_uten_blanke_bak = linje.strip() # fjerner blanke og linjeskifttegn bakerst kolonner = linje_uten_blanke_bak.split("\t") # kolonner er linje splittet opp mellom tabulatortegnene ("\t") liste.append(kolonner) # liste f?r et nytt element (ei liste) # Disse 3 tilordningene kunne vi ha gjort i ¨¦n tilordning: # liste.append(linje.strip().split("\t")) # argumentet til append ei liste som er resultatet av # at linja (tekststrengen) f?rst er strippet, s? splittes den opp mellom "\t"-ene # Etter for-l?kka lukkes filen og lista (av lister) returneres fil.close() return liste # Vi kunne kalt prosedyren ovenfor for ? lage lista, men nedenfor # ser vi hvordan prosedyren ville virket hvis kallet var: # kommuneliste = les_fil_returner_tabell("kommunedata.txt") # Her gj?r vi akkurat det samme som i prosedyren les_fil_returner_tabell # hvis den ble kalt med argumentet "kommunedata.txt" (str) kommuneliste = [] # lista som skal inneholde det svi leser fra filen fil = open("kommunedata.txt") for linje in fil: # variablene linje f?r i de f?rste 3 oml?pene er tekstverdiene: # '03\tOslo\t0301\tOslo\t0301\n' # '11\tRogaland\t1101\tEigersund\t1101\n' # '11\tRogaland\t1103\tStavanger\t1103\n' linje_uten_blanke_bak = linje.strip() # linje_uten_blanke f?r i de f?rste 3 oml?pene tekstverdiene: # '03\tOslo\t0301\tOslo\t0301' # '11\tRogaland\t1101\tEigersund\t1101' # '11\tRogaland\t1103\tStavanger\t1103' kolonner = linje_uten_blanke_bak.split("\t") # kolonner inneholder i de f?rste 3 oml?pene disse listene som innholdsverdi: # ['03', 'Oslo', '0301', 'Oslo', '0301'] # ['11', 'Rogaland', '1101', 'Eigersund', '1101'] # ['11', 'Rogaland', '1103', 'Stavanger', '1103'] # S? legger vi lista kolonner refererer til inn i lista med alle kommunene: kommuneliste.append(kolonner) # Disse 3 tilordningene kunne vi ha gjort i ¨¦n tilordning: # kommuneliste.append(linje.strip().split("\t")) # argumentet til append ei liste som er resultatet av # at linja (tekststrengen) f?rst er strippet, # s? splittes den opp mellom "\t"-ene # slutt for-l?kke fil.close() # lukker fila # kommuneliste er etter l?kka ei liste av 357 lister: # [ # ['03', 'Oslo', '0301', 'Oslo', '0301'], # ['11', 'Rogaland', '1101', 'Eigersund', '1101'], # ['11', 'Rogaland', '1103', 'Stavanger', '1103'], # ... + 354 lignende lister # ] kommuner = {} # Skal lage ei ordbok med info om alle kommuner, kommunenummer skal v?re n?kkel for komm in kommuneliste: # komm blir ei liste med info om ¨¦n kommune: # ['03', 'Oslo', '0301', 'Oslo', '0301'] # ['11', 'Rogaland', '1101', 'Eigersund', '1101'] # ['11', 'Rogaland', '1103', 'Stavanger', '1103'] # 0 1 2 3 4 (indekser) # Merk at alle elementene i listene er av type tekst(str) # komm[0] er fylkesnummeret(str) til kommunen fylkesnummer = komm[0] # komm[1] er navnet til fylket (str) kommunen ligger i fylkesnavn = komm[1] # komm[2] er kommunenummeret (str) kommunenummer = komm[2] # komm[3] er kommunens navn (str) kommunenavn = komm[3] # ?nsker ? lage ei ordbok med kommunenr som n?kkel, # og kommunenavn, fylkesnr og -navn i ei liste som # innholdsverdi. F.eks. for 1101 Eigersund: # { '1101': ['Eigersund', '11', 'Rogaland'] } kommuner[kommunenummer] = [ kommunenavn, fylkesnummer, fylkesnavn ] nykommune = Kommune(kommunenummer, kommunenavn) # kunne ogs? ha gjort dette uten tilordningene ovenfor slik: # kommuner[ komm[2] ] = [komm[3], komm[0], komm[1]] # skriver ut hele ordboka (kommenter denne vekk n?r du skal jobbe videre med programmet) print(kommuner) # VIDERE ARBEID v?ren 2025 # N? har vi to datastrukturer (ei liste og ei ordbok) som inneholder # data om kommunene. Jobb videre med denne informasjonen for ? # trene p? det du trenger ? jobbe med. Her er noen ideer # 1. Lag ei ordbok med fylkesnummer (n?kkel) og fylkesnavn (innholdsverdi) fylker = {} # Skal lage ei ordbok med info om alle fylker, fylkesnummer skal v?re n?kkel for komm in kommuneliste: # komm blir ei liste med info om ¨¦n kommune: # ['03', 'Oslo', '0301', 'Oslo', '0301'] # ['11', 'Rogaland', '1101', 'Eigersund', '1101'] # ['11', 'Rogaland', '1103', 'Stavanger', '1103'] # 0 1 2 3 4 # komm[0] er fylkesnummeret(str) til kommunen fylkesnummer = komm[0] # komm[1] er navnet til fylket (str) kommunen ligger i fylkesnavn = komm[1] if fylkesnummer in fylker: continue # fylket ligger alt i ordboka, g?r videre uten ? gj?re noe else: # har ikke sett dette fylket f?r fylker[fylkesnummer] = fylkesnavn print(fylker) # 2. Samme ordbok, men med kun norsk navn (str) p? fylket # F.eks. 'Finnmark ¨C Finnm¨¢rku ¨C Finmarkku' --> 'Finnmark' # F?rst legger vi merke til at dette bare gjelder 4 fylker: fylker_enkelt_navn = { '18': 'Nordland', '50': 'Tr?ndelag', '55': 'Troms', '56': 'Finnmark'} for fylkesnr in fylker_enkelt_navn: fylker[fylkesnr] = fylker_enkelt_navn[fylkesnr] print(fylker) # { '03': 'Oslo', '11': 'Rogaland', '15': 'M?re og Romsdal', # '18': 'Nordland', '31': '?stfold', '32': 'Akershus', # '33': 'Buskerud', '34': 'Innlandet', '39': 'Vestfold', # '40': 'Telemark', '42': 'Agder', '46': 'Vestland', # '50': 'Tr?ndelag', '55': 'Troms', '56': 'Finnmark' } # 3. Lag ei ny ordbok som kommuner, men med bare ett navn p? fylker og kommuner kommuner_enkelt_navn = { } for kommune in kommuner: # kommune blir n?kkelverdier, dvs. kommunenumre # kommuner[kommune] er n? ei liste med kommunedata # f.eks. kommuner['5021'] == ['Oppdal', '50', 'Tr?ndelag - Tr??ndelage'] # Vi er interessert i kommunenavn, alts? indeks 0 kommunenavn = kommuner[kommune][0].split(' - ') # kommunenavn blir over ei liste av navn; uansett er det f?rste/eneste elementet vi trenger: kommunenavn = kommunenavn[0] # Vi setter nytt (enklere) kommunenavn, resten er uforandra: fylkesnr = kommuner[kommune][1] fylkesnavn = fylker[fylkesnr] kommuner_enkelt_navn[kommune] = [kommunenavn, fylkesnr, fylkesnavn] print(kommuner_enkelt_navn) # Forelesning 19. mars # Lage kommune- og fylkesobjekter (ved hjelp av klasser) # Kom gjerne med innspill f?r/under forelesningen! # Videre arbeid # Lag ny datafil(er) (skriv til fil) p? grunnlag # av ordboka i oppgave 3 (med kun ett navn p? fylker og kommuner)