Python: Oppslagslister (dictionaries) og mengder 3. utgave: Kapittel 9

Like dokumenter
MENGDER (SETS) Læringsmål og pensum. Kapittel 9.2

TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og mengder (sets) - Kapittel 9. Professor Alf Inge Wang

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og sets (mengder) Utgave 3: Kap. 9. Terje Rydland - IDI/NTNU

Python: Mengder og Dictionaries 3. utgave: Kapittel 9

Python: Mengder og Dictionaries 3. utgave: Kapittel 9

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og sets (mengder) Utgave 3: Kap. 9. Terje Rydland - IDI/NTNU

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Systemutvikling (Software Engineering) TDT 4110 IT Grunnkurs Professor Guttorm Sindre

INF120: Oblig 3. Yngve Mardal Moe

Øvingsforelesning 9 i Python (TDT4110)

TDT4110 Informasjonsteknologi grunnkurs: Tema: Lister og tupler. - 3rd edition: Kapittel 7. Professor Alf Inge Wang

TDT4110 Informasjonsteknologi grunnkurs: Python: Repetisjon. Professor Alf Inge Wang

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Repetisjon, del 2. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Oppsummering fra sist

Læringsmål og pensum. Inn- og utoperasjoner 21/10/16

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak (exceptions) Utgave 3: Kap. 6. Terje Rydland - IDI/NTNU

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

Python: Strenger 3. utgave: Kapittel 8

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

Øvingsforelesning 3 Python (TDT4110)

Øvingsforelesning i Python (TDT4110)

Øvingsforelesning 1 Python (TDT4110)

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Python: Filer og unntak Gaddis: Kapittel 6

Repetisjon, del 1. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum. if (be): else (not_to_be):

Høst Øving 5. 1 Teori. 2 Månedskalender. Norges teknisknaturvitenskapelige universitet Institutt for datateknikk og informasjonsvitenskap

TDT4105 Informasjonsteknologi, grunnkurs MatLab: Filbehandling - load, save, type - fopen, fgetl, feof, fprintf, fclose

TDT4110 Informasjonsteknologi grunnkurs: Programmering: En større case. Professor Alf Inge Wang

Læringsmål og pensum. En større case. Mål Lære å lage større og sammensatte programmer Pensum Kapitlene 1-9 og 12.

TDT4105 Informasjonsteknologi, grunnkurs

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Tirsdag 21/11. Onsdag 24/11. Tirsdag 12/12. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Lage større programmer (Python, relatert til teoridelen om Software Engineering ) TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

TDT4110 IT Grunnkurs Høst 2015

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case. Terje Rydland - IDI/NTNU. Lære å lage større og sammensatte programmer

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

TDT4110 Informasjonsteknologi grunnkurs: Eksempler. Mangekanter

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Øvingsforelesning i Python (TDT4110)

LO118D Forelesning 3 (DM)

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Læringsmål og pensum. v=nkiu9yen5nc

Opphavsrett: Forfatter og Stiftelsen TISIP

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Python: Lister og tupler Gaddis: Kapittel 7

TDT4102 Prosedyreog objektorientert programmering Vår 2016

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Løse reelle problemer

Obligatorisk oppgave 1 INF1020 h2005

TDT4110 IT Grunnkurs Høst 2014

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

Hva er en algoritme? Har allerede sett på mange algoritmer til nå i IT1101. Forholdet mellom en algoritme og et program. Algoritme program prosess

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Steg 1: Rest etter divisjon

TDT4110 IT Grunnkurs Høst 2012

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Steg for steg. Sånn tar du backup av Macen din

TDT4110 IT Grunnkurs Høst 2016

Håndtere mange verdier

Øvingsforelesning 5 Python (TDT4110)

Python: Variable og beregninger, innlesing fra tastatur utskrift til skjerm. TDT4110 IT Grunnkurs Professor Guttorm Sindre

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

Læringsmål og pensum. Algoritmeeffektivitet

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang. Sjekkliste. Introduksjon

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler Utgave 3: Kap

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger Utgave 3: Kap. 8

Øvingsforelesning 5 Python (TDT4110)

Skilpadder hele veien ned

Innhold uke 9. Objektorientert programmering i Python. Om ukens pensum. Referanser og objekter Tema: Mer komplekse strukturer

En oppsummering (og litt som står igjen)

INF Algoritmer og datastrukturer

Ta kontakt i pausen. Viktig at vi kommer i gang med dette arbeidet!

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

TDT4110 Informasjonsteknologi grunnkurs: Uke 48 Oppsummering/Spørretime. Professor Alf Inge Wang

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

Øvingsforelesning 6 i Python (TDT4110)

Objektorientert programmering i Python

INF109 - Uke 1b

TDT4110 IT Grunnkurs Høst 2014

Transkript:

Python: Oppslagslister (dictionaries) og mengder 3. utgave: Kapittel 9 TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum Mål Forstå prinsippene for, og kunne bruke i praksis Mengder (sets) Oppslagslister (dictionary) Vite forskjell på disse og lister, tupler, strenger Vite forskjell på tekstfiler og binærfiler Forstå, og kunne bruke, serialisering av objekter Pensum Starting out with Python, Chapter 9: Dictionaries and Sets 2

Kapittel 9.2 Mengder (Sets)

Mengder (Eng.: sets) Datastruktur for matematiske mengder Hvert element i en mengde er unikt Umulig å legge inn dubletter Mengder er ikke ordnet kan ikke anta noen bestemt rekkefølge De fleste funksjoner for lister kan brukes for mengder Mengder har flere spesifikke operasjoner, bl.a.: intersection = no. snitt union Ulike typer mengdedifferanser 4

Opprette og endre på mengder En mengde opprettes ved å bruke funksjonen set( ) A = set([5,3,3,12]) B = set([true, ost, 23.2, 92, False]) C = set( aaabcd ) # gir { a, b, c, d } Eller ved direkte angivelse av innhold: D = {9,4,1,3} Legge til og fjerne elementer fra en mengde: A.add(9) # Legg til ett element A.update([3,4,2]) B.remove(92) # Legg til flere elementer 5

Iterasjon og medlemsskap For-løkke kan iterere over en mengde Som for lister, tupler, filer, strenger for x in mengde: print(x) # Skriver ut elementer under hverandre Undersøke om verdi tilhører mengde: in, not in Tilsvarer og i matematisk notasjon if x in A: print( Verdien, x, er i mengden A ) 6

Mengdeoperasjoner på A og B Union av to mengder: C = A.union(B) Snitt av to mengder: C = A.intersection(B) mengdedifferanse: C = A.difference(B) # C = A U B # C = A B # C = A \ B Symmetrisk mengdedifferanse: C = A.symmetric_difference(B) # C = (A U B) \ (A B) Sjekke delmengde eller supermengde: A.issubset(B) # True hvis A B, ellers False A.issuperset(B) # True hvis A B, ellers False 7

Oppgave: mengder Start med koden mengde-uferdig.py Hvis du ikke har den, holder det å gjenta input-setningene Lag et program som Bruker mengdeoperasjoner Finner mulige mistenkte for en tenkt forbrytelse Videre hint om hva som må gjøres står i koden Oppgave: mengde-uferdig.py Løsning: mengde-ferdig.py 8

Eksempel: Syv fjell e.l. I mange byer fins arrangementer hvor man skal besøke et visst antall fjelltopper eller andre punkter av interesse innen en viss tidsperiode Anta at vi har fått inn navnelister fra hvert av disse punktene. Vi ønsker nå å generere to ting: 1. En oversikt over alle deltagere, dvs. alle som fins på minst en av de innleverte listene 2. En oversikt over de ivrigste deltagerne, dvs. de som har klart å besøke alle punktene (og dermed fins på alle liste) Oppgave: fjell-uferdig.py Løsning: fjell-ferdig.py 9

Kapittel 9.1 Oppslagslister (Dictionary)

Oppslagsliste (Dictionary) Lagrer en samling av data. Minner litt om lister men har klare forskjeller: Defineres ved { } (ALT+SHIFT 8/9 på Mac) Indeks kan være hva som helst (ikke bare tall) F.eks strenger, heltall, flyttall, boolske verdier Indeks kalles nøkkel (key) Brukes når vi vil gjøre oppslag på en verdi for å finne andre assosierte verdier A = {} # Tom dictionary A[ Kari ] = 92925492 # Oppretter et element tlf={ Jo : 73540000, Per : 92542312, 'Else : 54239212} print(tlf[ Per ]) # Skriver ut verdien 92542312 11

Bruk av in og not in Sjekke om elementer finnes som lister, mengder etc. tlf={'jo' : 73540000, 'Per' : 92542312, 'Else' : 54239212} navn = input( Hvem vil du vite nummeret til? ) if navn in tlf: print(tlf[navn]) else: print( Har ingen opplysninger om + navn) 12

Operasjoner for dictionaries Operasjon Forklaring Operasjon Forklaring len(d) d[k] d[k] = v del d[k] d.clear() Antall elementer i d Verdi til element i d med nøkkel k Sett element k til verdi v Slett element k i d Fjerne alle element i d d.items() d.keys() d.values() d.get(k) Returnerer liste av (nøkkel,verdi) par Returnerer liste av nøkler i d Returnerer liste av verdier i d Samme som d[k] d.copy() d.has_key(k) Lag kopi av d Fjernet i Python 3. Må bruke in i stedet. d.get(k,v) Returnerer d[k] hvis k er gyldig, ellers v

Ulike datatyper i dictionaries Verdier i dictionary kan også være lister Eks. lagre tlf, adresse og betalingsinfo i en dictionary: db = {} # Oppretter dictionary db[ Jo ]=[90503020, Logata 4, 7000 Trondheim, True] db[ Ann ]=[50201020, Strandg. 2, 5000 Bergen, False] print(db[ Jo ]) # skriver ut lista med data for Jo Fordel med dictionary vs. f.eks liste av lister: Kan slå opp direkte på meningsfylt indeks Mens indeks i liste ofte er intetsigende (kun rekkefølge) Dictionary: mindre strev med å lete etter riktig element så lenge nøkkelen er det vi leter etter 14

for-løkke og dictionary Bruker man for-løkke på en dictionary, løper man igjennom nøklene til dictionary: d = { navn : Per, alder : 28, IQ : 129} for x in d: print(x) # går igjennom nøkler i d # skriver ut nøklene navn, alder, IQ For å sikre gjennomgang av nøkler alfabetisk: for x in sorted(d.keys()): # sorterer nøkler print(x) 15

Eksempel på lur bruk av nøkkel Norges Scrabbleforbund (NSF) har ei tekstfil drøyt 622.000 ord som er lovlig å skrive i Scrabble (på norsk) Alfabetisk sortert, greit for å sjekke om et ord er lovlig eller ikke Vi vil lage et program som finner anagrammer Bruker kan skrive inn en tekststreng Finne alle ord i NSF-lista som bruker de samme bokstavene Men i fri rekkefølge (ETTER, ERTET, RETTE ) Vil unngå å søke gjennom hele fila / lista for hver streng Mål: Kunne slå opp direkte om et ord har anagrammer eller ikke Da kan oppslagsliste (dictionary) være en lur datastruktur Men hva bør vi bruke som nøkkel? Nå er ord for ord, alfabetisk sortert, ikke lenger det gunstigste 16

Ide til løsning: Regne om hvert ord til et tall Identiske bokstaver samme tall Forskjell i antall eller type bokstav annet tall HVORDAN?? Kan omregne hvert ord til et produkt av primtall 2, 3, 5, 7, 11, 13, 17,., 109 (primtall nr 29) Hver bokstav assosieres med ett av disse tallene Det blir store tall for lange ord men enklere enn å søke gjennom hele lista hver gang For å redusere størrelsen på tallene noe bruk de laveste tallene for de vanligste bokstavene E=2, T=3, R=5, Både ET og TE vil få nøkkel 6 (2*3) Både ERT, TER og TRE vil få nøkkel 30 (2*3*5) 17

Ide til løsning (forts.) Bygger så en dictionary ved å Opprette tom dictionary Gjenta for hvert ord i ordlistefila: Les inn ordet Regne ut nøkkel for ordet (produkt av primtall) Putte ordet inn i dictionary på denne nøkkelen HVIS flere ord på samme nøkkel: append() i liste ELLERS (første ord på denne nøkkelen): lage liste med ordet Returnere full dictionary Når brukeren skriver inn en tekst og vil finne anagram: Regne ut nøkkelverdi for brukerens tekst HVIS denne nøkkelen fins i dictionary: Returnere lista av ord (anagrammer) som tilhører nøkkelen ELLERS: Returnere tom liste (ingen anagrammer funnet) anagram1.py 18

Kapittel 9.3 Serialisering av objekter

Serialisering av objekter Konverterer et objekt til en strøm av bytes Gir en persistent variabel Data lagres til fil, kan senere leses tilbake Verdiene overlever programslutt, at maskin slås av, etc. I Python: biblioteket pickle har funksjoner for dette Fordeler med binærfiler (vs. tekstfil) Får dataene direkte inn i ønsket datastruktur Slipper konvertering til / fra strenger Vanligvis mindre plasskrevende Ulemper vs. tekstfil Fila er ikke lesbar for mennesker Applikasjonsavhengig må ha spesifikk kjennskap til filformatet for å kunne bruke fila 20

Lagre dictionary til disk Bruk biblioteket pickle metoden pickle.dump( ) Må åpne fila som binærfil og ikke som tekst, det er mer enn tekst som lagres (struktur): db={ Jo : [10, Skogata 3 ], Per :[20, Heigata 2 ]} import pickle # Importerer modulen f = open( database.dat, wb ) # b=binary pickle.dump(db,f) # Dumper db til disk f.close() # Lukker fila 21

Laste inn dictionary fra disk Metoden pickle.load() Husk å åpne fila som binærfil og ikke tekst. import pickle f = open( datafil.dat, rb ) data = pickle.load(f) f.close() # r=read, b=binary # Laster inn dict fra disk 22

Anagram-finneren, V2 Serialisering kan redusere ventetid for brukeren Dele opp i tre filer: En modul for felles kode: Et backstage -program Leser ordlista fra Scrabbleforbundet Bygger opp dictionary og dumper den på fil Et program for brukeren: Leser inn dictionary fra fil Spør brukeren om tekster og finner anagrammer Brukeren trenger kun kjøre brukerprogrammet Backstage-programmet kjøres sjeldnere anagram2.py F.eks kun hver gang det kommer ny versjon av ordlista Brukeren slipper mye venting i starten anagram2-backstage.py anagram2-bruker.py 23

Kahoot 10 spørsmål om Mengder, oppslagslister og serialisering Basert på det som forelesningen har dekket 24

Oppsummering Mengder (sets) er nyttige for å gjøre operasjoner som Snitt, union og mengdedifferanse Mengder defineres ved å bruke funksjonen set(liste) Oppslagsliste (dictionary) ligner på lister, men Man kan bruke hva som helst som nøkkel (indeks). Kan opprettes tom: A = {} Eller ved nøkkel + data: A = { navn : Petter Ole } Trenger ikke indeks som er i rekkefølge Kan serialiseres / dumpes til binærfil 25