2.25. Ordbog (dictionary)

Lad os starte gennemgangen af ordbøger (dictionaries) et helt andet sted, ved et tilbageblik til lister og tuples.

Liste:
>>> ordliste = ['Arnager', 1, 'Hasle', 2, 'Vang', 3]
>>> ordliste
('Arnager', 1, 'Hasle', 2, 'Vang', 3)
>>> ordliste[0]
'Arnager'

tuple: >>> ordliste = 'Arnager', 1, 'Hasle', 2, 'Vang', 3 >>> ordliste ('Arnager', 1, 'Hasle', 2, 'Vang', 3) >>> ordliste[0] 'Arnager'

Ordbogen:
>>> ordliste = {'Arnager': 1, 'Hasle': 2, 'Vang' : 3}
>>> ordliste
{'Arnager': 1, 'Hasle': 2, 'Vang': 3}
ordliste[0]
KeyError: 0

Sammenlign nu de ovenstående bevidst ukommenterede eksempler, så er vi ligesom klar til at gå videre til det egentlige. En ordbog/ordliste adskiller sig fra listen på den måde at listen er omgivet af firkaltede parenteser, mens ordbogen er omgivet af krøllede parenteser. tuples kan, men ikke nødvendigvis, være omgivet af almindelige runde parenteser. Mens liste og tuple kan returnere element v.h.a. navn og firkantede parenteser indeholdende elementnummer, kræver returnering fra en ordbog en lidt mere kompliceret operation. Den vil vi tage lidt i etaper:

>>> if "Hasle" in ordliste:
  print ordliste['Hasle']
else:
  print 'ikke fundet'
2

Hvis vi nu i stedet for at tænke på den direkte oversættelse af ordet dictionary (ordbog) og i stedet for tænker på den som en ordliste - en indholdsfortegnelse i en bog, så kan det returberede 2-tal ovenfor fint henvise til den side i bogen, hvor Hasle er omtalt og sådan fremdeles.

Hvis vi i stedet for at tænke på the dictionary som indholdslisten tænker på den som en lænke (a link) på en hjemmeside, så vil det ofte være således, at en hotlink i form af en virtuel knap med en eller anden påskrift ved et klik med musen fører til ankerpladsen - en beskrivelse eller omtale af påskriften, så kunne en ordliste komme til at se ud som denne:

ordliste = {"Arnager": "Lille fiskerby syd for Bornholms flyveplads." ,
"Hasle": "Lille vestbornholmsk by.", 'Vang' : 'Lille by, havde tidligere 
en del stenindustri.' }
>>> if "Vang" in ordliste:
  print ordliste['Vang']
else:
  print 'ikke fundet'
Lille by, der tidligere havde en del stenindustri.

Nu er vi vist allerede kommet dertil, hvor Pythons ordbøger kan bruges til noget konstruktivt. Men der er meget mere endnu, vi skal se på i den forbindelse.

>>> indeks = {}
>>> def indskriv(indgangsord, sidenummer):
        if indeks.has_key(indgangsord):
            indeks[indgangsord].append(sidenummer)
        else:
            indeks[indgangsord] = [sidenummer]
>>> indskriv("Gudhjem",0)
>>> indeks
{'Gudhjem': [0]}
indeks = {}
def nyIndgang(noegle, sidenummer):
    if indeks.has_key(noegle):
        indeks[noegle].append(sidenummer)
    else:
        indeks[noegle] = [sidenummer]
>>> nyIndgang("Arnager",0)
>>> nyIndgang("Bodilsker",1)
>>> nyIndgang("Pedersker",2)
>>>
>>> indeks
{'Arnager': [0], 'Bodilsker': [1], 'Pedersker': [2]}
# Pas på med sidenumrene ellers:
>>> nyIndgang("Arnager",0)
>>> nyIndgang("Bolsker",0)
>>> indeks
{'Arnager': [0], 'Bolsker': [0]}

Mange har anskaffet et eller flere af de efterhånden prisbillige digitale kameraer. De lagrer oftest billederne i jpg eller tif format. Førstnævnte er det mest velegnede til hjemmesider m.v. Samme filtype kan desværre ikke uden videre anvendes af Python - der skal et ekstra modul til. Derfor kan det være en fordel at konvertere billeder til gif formater, der har en række fordele frem for jpg formatet, med generelt fylder en smule mere. Tif formatet fylder temmelig mere end de to andre formater. Det skyldes primært at tif kan gemme flere farver - farver der ofte er usynlige for det menneskelige øje. Her vil jeg ene og alene vise, hvordan gif og jpg formaterne hentes inde i Python programmer.

from Tkinter import *
root = Tk()
foto = PhotoImage(file = "AKTIV/h.gif")
Button(root, image = foto).pack()
root.mainloop()

eller f.eks.

from Tkinter import *
root = Tk()
fotobibliotek = "AKTIV"
foto = PhotoImage(file = "fotobibliotek + "h.gif")
Button(root, image = foto).pack()
root.mainloop()

Det følgende eksempel kræver PIL installeret - PIL håndterer over 30 formater PIL kan hentes fra www.pythonware.com til såvel Windows som Linux. Pas på at få den rette (nyeste) version af det gratis eller evt. det kommercielle modul.

from Tkinter import *
import ImageTk, Image
root = Tk()
fotobibliotek = "AKTIV"
foto = ImageTk.PhotoImage(file = fotobibliotek + "h.jpg")
Button(image = foto).pack()
root.mainloop()

Figur 2-1. Skyer

from Tkinter import *
from glob import glob
from tkMessageBox import askyesno
from tkFileDialog import askopenfilename
import random
def opretArvinger(root):
    global arbejdsplads, tilslutAfbryd
    arbejdsplads = Canvas(root, bg='white')
    arbejdsplads.pack(side=LEFT, expand=YES, fill=BOTH)
    tilslutAfbryd = Button(root, text='Start', command=onStart)
    tilslutAfbryd.pack(fill=BOTH)
    Button(root, text='Åbn',  command=onOpen).pack(fill=BOTH)
    Button(root, text='Klokke',  command=onBeep).pack(fill=BOTH)
    Button(root, text='Afbryd',  command=onQuit).pack(fill=BOTH)
def onStart():
    global rundgang
    rundgang = 1
    tilslutAfbryd.config(text='Stop', command=onStop)
    onTimer()
def onStop():
    global rundgang
    rundgang = 0
    tilslutAfbryd.config(text='Start', command=onStart)
def onOpen():
    global foto
    onStop()
    pick = askopenfilename(initialdir=bibliotek)
    if pick:
        foto = PhotoImage(file=pick)
        arbejdsplads.config(height=foto.height(), width=foto.width())
        arbejdsplads.create_image(2, 2, image=foto, anchor=NW)
def onQuit():
    if askyesno('Verify', 'Vil du slutte?'):
        root.quit()
def onBeep():
    global hyl
    hyl = hyl ^ 1
def onTimer():
    global foto
    if rundgang:
        pick = random.choice(fotos)
        foto = PhotoImage(file=pick)
        arbejdsplads.create_image(2, 2, image=foto, anchor=NW)
        if hyl: root.bell()
        root.after(milSekunder, onTimer)
import sys
if len(sys.argv) == 2:
    bibliotek = sys.argv[1]
else:
    bibliotek = '../gifs' # Forvalgt bibliotek
fotos = glob(bibliotek + '/*.gif')
root = Tk()
opretArvinger(root)
milSekunder = 2000
hyl  = 1
root.mainloop()

from Tkinter import *
from glob import glob
from tkMessageBox import askyesno
from tkFileDialog import askopenfilename
import random
def opretArvinger(root):
    global arbejdsplads, tilslutAfbryd
    arbejdsplads = Canvas(root, bg='white')
    arbejdsplads.pack(side=LEFT, expand=YES, fill=BOTH)
    tilslutAfbryd = Button(root, text='Start', command=onStart)
    tilslutAfbryd.pack(fill=BOTH)
    Button(root, text='Åbn',  command=onOpen).pack(fill=BOTH)
    Button(root, text='Klokke',  command=onBeep).pack(fill=BOTH)
    Button(root, text='Afbryd',  command=onQuit).pack(fill=BOTH)
def onStart():
    global rundgang
    rundgang = 1
    tilslutAfbryd.config(text='Stop', command=onStop)
    onTimer()
def onStop():
    global rundgang
    rundgang = 0
    tilslutAfbryd.config(text='Start', command=onStart)
def onOpen():
    global foto
    onStop()
    pick = askopenfilename(initialdir=bibliotek)
    if pick:
        foto = PhotoImage(file=pick)
        arbejdsplads.config(height=foto.height(), width=foto.width())
        arbejdsplads.create_image(2, 2, image=foto, anchor=NW)
def onQuit():
    if askyesno('Verify', 'Vil du slutte?'):
        root.quit()
def onBeep():
    global hyl
    hyl = hyl ^ 1
def onTimer():
    global foto
    if rundgang:
        pick = random.choice(fotos)
        foto = PhotoImage(file=pick)
        arbejdsplads.create_image(2, 2, image=foto, anchor=NW)
        if hyl: root.bell()
        root.after(milSekunder, onTimer)
import sys
if len(sys.argv) == 2:
    bibliotek = sys.argv[1]
else:
    bibliotek = '../gifs' # Forvalgt bibliotek
fotos = glob(bibliotek + '/*.gif')
root = Tk()
opretArvinger(root)
milSekunder = 2000
hyl  = 1
root.mainloop()

Figur 2-2. Fotoarkiv