Python: Mengder og Dictionaries 3. utgave: Kapittel 9

Like dokumenter
Python: Mengder og Dictionaries 3. utgave: Kapittel 9

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

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

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

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

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

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

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

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

INF120: Oblig 3. Yngve Mardal Moe

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

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

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

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

TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak ( exceptions ) - 3rd edition: Kapittel 6. Professor Alf Inge Wang

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

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

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

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

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.

Oppsummering fra sist

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

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

Øvingsforelesning 9 i Python (TDT4110)

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.

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

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

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

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

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

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

Python: Filer og unntak Gaddis: Kapittel 6

Python: Lister og tupler Gaddis: Kapittel 7

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

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

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.

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

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

Læringsmål og pensum. v=nkiu9yen5nc

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

Python: Strenger 3. utgave: Kapittel 8

TDT4110 Informasjonsteknologi grunnkurs: Eksempler. Mangekanter

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

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

TDT4105 Informasjonsteknologi, grunnkurs

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

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

TDT4110 IT Grunnkurs Høst 2015

Håndtere mange verdier

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

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

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Løkker og lister. Løse problemer med programmering. INF1001, uke3 Geir Kjetil Sandve

PGZ - Hangman Ekspert Python Lærerveiledning

Øvingsforelesning 1 Python (TDT4110)

Obligatorisk oppgave 1 INF1020 h2005

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

TDT4110 IT Grunnkurs Høst 2014

TDT4110 IT Grunnkurs Høst 2016

INF1800 LOGIKK OG BEREGNBARHET

Informasjon Prøveeksamen i IN1000 høsten 2018

Øvingsforelesning 5 Python (TDT4110)

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

Steg 1: Rest etter divisjon

Plan for dagen. Vprg 4. Dagens tema - filbehandling! Strømmer. Klassen FilLeser.java. Tekstfiler

INF1800 Forelesning 2

INF2220: Forelesning 3

Øvingsforelesning 5 Python (TDT4110)

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

Python: Filer og unntak Gaddis: Kapittel 6

Mengdelære INF1800 LOGIKK OG BEREGNBARHET FORELESNING 2: MENGDELÆRE. Læreboken. Mengder. Definisjon (Mengde) Roger Antonsen

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

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.

Øvingsforelesning 3 Python (TDT4110)

TDT4110 IT Grunnkurs Høst 2016

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

Læringsmål og pensum. Algoritmeeffektivitet

Filbehandling Tekstfiler

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

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

Kap 2: Løkker og lister

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

Øvingsforelesning i Python (TDT4110)

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

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

Løse reelle problemer

TDT4110 IT Grunnkurs Høst 2014

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

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

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

UNIVERSITETET I OSLO

Læringsmål og pensum. Intro til returverdifunksjoner: Generering av tilfeldige tall 27/09/16

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Rekker (eng: series, summations)

Transkript:

Python: Mengder og Dictionaries 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) Ordbøker (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

Foregående to uker vs. denne Sammensatte variable: lagre data i primærminnet Lister; tupler; strenger [1, 3, 3, 5] [ a, e, i, o, u, y ] ; (1, 3, 3, 5) ( a, e, i, o, u, y ) ; 1335, aeiouy Rekkefølge på elementene. Lister er muterbare, tupler og strenger ikke Mengder, dictionaries {1, 3, 5} { a, e, i, o, u, y } { a :.-, b : -, c : -.-. } { 010101 23456 : [ Per, Olsen, Trondheim ] } Muterbare, ingen fast rekkefølge, ingen duplikater FORDEL: Raskere oppslag, raskere å legge til eller fjerne element ULEMPE: Større plassforbruk enn lister, tupler, strenger Filer: lagre data permanent i sekundærminne Tekstfiler: leses og skrives til/fra strengvariable FORDEL: Bredt anvendelig, lett å lese av mange slags apper ULEMPE: Litt treg lesing, stor plassbruk, tidsbruk til konvertering Binærfiler: kan leses/skrives til/fra andre variable (f.eks. dictionary) FORDEL: Mer kompakt lagring, raskere lesing, slipper konvertering ULEMPE: Kan bare leses av visse program 3

Kapittel 9.2 Mengder (Sets)

Mengder (Eng.: sets) Datastruktur for matematiske mengder Unike element, ingen dubletter Ikke ordnet, dvs. ingen bestemt rekkefølge De fleste funksjoner for lister kan brukes for mengder Mengder har flere spesifikke operasjoner, bl.a.: union intersection = no. snitt Ulike typer mengdedifferanser 5

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} # NB: D = {} gir en tom dictionary. Tom mengde: D = set() Legge til og fjerne elementer fra en mengde: A.add(9) # Legg til ett element A.update([3,4,2]) # Legg til flere elementer B.remove(92) # fjerner tallet 92 6

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 ) 7

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) Symmetrisk mengdedifferanse: # C = A U B # C = A B # C = A \ B C = A.symmetric_difference(B) # C = (A U B) \ (A B) Sjekke delmengde eller supermengde: A.issubset(B) A.issuperset(B) # True hvis A B, ellers False # True hvis A B, ellers False 8

Oppgave LETTERE: Start med koden mengde_uferdig.py Fullfør koden ved å skrive ferdig de to funksjonene lag_mengde() og finn_mistenkte(). Personer skal komme fram som mulige mistenkte hvis de hadde våpen og motiv, men ikke alibi Løsning: mengde-ferdig.py VANSKELIGERE: Ser for oss et trimløp hvor de besøker flest mulig fjelltopper på en dag. Får inn ei liste av lister, hvor hver indre liste er de som har vært på en bestemt topp. Start med koden fjell_uferdig.py Fullfør koden ved å skrive ferdig de to funksjonene, bruk mengder for å finne hvem som har deltatt (minst en topp) og hvem som har vært på alle toppene. Løsning: fjell-ferdig.py 9

Kapittel 9.1 Ordbøker (Dictionary)

Ordbok (Dictionary) Lagrer en samling av data. Defineres ved { } (ALT+SHIFT 8/9 på Mac) Nøkkelverdi kan være hva som helst (ikke bare tall) F.eks strenger, heltall, flyttall, boolske verdier Indeks kalles nøkkel (key) Gjøre oppslag på en verdi, finne assosierte verdier A = { } # Tom dictionary A[ 'Kari ] = 92925492 # Oppretter et element tlf = {'Jo' : 73540000, 'Per' : 92542312, 'Else' : 54239212} print( tlf[ 'Per ] ) # Skriver ut 92542312 11

Operasjoner for dictionaries in for å sjekke om nøkkelverdi fins 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 nøkkelverdi 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 13

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) 14

Hva bruke som nøkkel? Kommer an på anvendelsen, hva vi vil slå opp på Eks.: Persondata Personnummer. Fordel: unikt. Ulempe: husker det ikke, bør ikke spres for mye Telefonnummer navn Eks.: liste med ord Oversettelse norsk-engelsk: { god : good, stor : big } Gradbøying: { god : [ bedre, best ], stor : [ større, størst ] } Rimkatalog: { erte : [ berte, erte, fjerte, hjerte, smerte, terte ] } Anagrammer: finne ord med samme bokstaver uavh. av rekkefølge {??? : [ ad, da ],???: [ ert, ter, tre ],??? : [ etter, rette, treet ] } Hva bruke som nøkkel her? 15

Ide til nøkkel for anagrammer: 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) 16

Oppgave Laging av dictionary LETTERE: Start med koden liste_og_dict_v0.py Skriv funk. lag_dictionary() på samme måte som lag_2d_liste() bare at den legger ordene i en dictionary, f.eks { god : [ bedre, best ], stor : [ større, størst ]} heller enn 2d liste [ [ god, bedre, best ], [ stor, større, størst ] ] VANSKELIGERE: Start med koden anagram_v0.py Skriv funksjonen string_2_key() som gir nøkkeltall for et ord, og list_2_dic() som går igjennom hele lista av ord og lager en dictionary hvor alle anagrammer er plassert ved samme nøkkel. NB: Plasser fila nsf2016.txt på samme katalog som koden Løsning: liste_og_dict_v1.py Løsning: anagram_v1.py 17

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 19

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 20

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 21

Anagram-finneren, V2 Serialisering kan redusere ventetid for brukeren Dele opp i tre filer: anagram_v2_felles.py En modul for felles kode: Et admin-program anagram_v2_admin.py Leser ordlista fra Scrabbleforbundet fra tekstfil Bygger opp dictionary og dumper den på binærfil Et program for brukeren: anagram_v2_user.py Leser inn dictionary fra binærfil Spør brukeren om tekster og finner anagrammer Brukeren trenger kun kjøre brukerprogrammet Admin-programmet kjøres sjeldnere F.eks kun hver gang det kommer ny versjon av ordlista Brukeren slipper mye venting i starten J 22

Oppsummering Mengder (sets) er nyttige for å gjøre operasjoner som Snitt, union og mengdedifferanse Mengder defineres ved å bruke funksjonen set( ) Ordbok (dictionary) Kan bruke hva som helst som nøkkel, eks. D = { Norge : [ Oslo, Bergen, Trondheim } Trenger ikke indeks som er i rekkefølge Kan serialiseres / dumpes til binærfil 23