Hieronder staan de dictionary methodes die het meest gebruikt worden.
copy()
Net als met lists, kun je een variabele die een dictionary bevat via de
assignment operator aan een andere variabele koppelen, en daarmee maak
je dan een alias voor de dictionary (als je je dat niet herinnert, moet
je er hoofdstuk
131
nog eens op naslaan). Het is niet mogelijk dezelfde “truuk” die bij
lists bestaat te gebruiken om een kopie te maken. In plaats daarvan
hebben dictionaries een methode copy()
die een kopie van de dictionary
maakt en retourneert.
fruitmand = { "appel":3, "banaan":5, "kers":50 }
fruitmandalias = fruitmand
fruitmandcopy = fruitmand.copy()
print( id( fruitmand ) )
print( id( fruitmandalias ) )
print( id( fruitmandcopy ) )
Merk op dat een dergelijke kopie een ondiepe kopie is (zie hoofdstuk
132
als je je het verschil tussen ondiepe en diepe kopieën niet herinnert).
Als je een diepe kopie wilt maken, moet je de deepcopy()
functie van
de copy
module gebruiken.
keys()
, values()
, and items()
De methode keys()
levert een iterator die alle keys van de dictionary
genereert. De methode values()
levert een iterator die alle waardes
van een dictionary genereert. De methode items()
levert een iterator
die 2-tuples genereert die alle keys en waardes van de dictionary
bevatten.
Ik zeg specifiek dat deze methodes iterators retourneren en niet lists. Als je wat ze retourneren in lists wil veranderen, moet je list casting gebruiken (zie hoofdstuk 133).
fruitmand = { "appel":3, "banaan":5, "kers":50 }
print( list( fruitmand.keys() ) )
print( list( fruitmand.values() ) )
print( list( fruitmand.items() ) )
Op dit punt vraag je je wellicht af wanneer je een iterator kunt
gebruiken. Je gebruikt iterators met name in for
loops (maar je kunt
ze ook gebruiken als argumenten voor de functies max()
, min()
en
sum()
).
fruitmand = {"appel":3,"banaan":5,"kers":50,"druif":0,"mango":2}
for key in fruitmand.keys():
print( "{}:{}".format( key, fruitmand[key] ) )
print( sum( fruitmand.values() ) )
Omdat deze code een onvoorspelbare volgorde voor de keys doorloopt, wil
je ze meestal sorteren voordat je ze in de loop verwerkt. Omdat keys()
geen list maar een iterator levert, kun je ze niet direct sorteren, maar
moet je het resultaat van keys()
eerst met een list casting in een
list omzetten. Daarna kun je de list sorteren.
fruitmand = {"appel":3,"banaan":5,"kers":50,"druif":0,"mango":2}
keylist = list( fruitmand.keys() )
keylist.sort()
for key in keylist:
print( "{}:{}".format( key, fruitmand[key] ) )
Je kunt niet direct de sort()
methode toepassen op de list casting,
met andere woorden, keylist =
list( fruitmand.key() ).sort()
werkt
niet. Je moet eerst de list creëren, en dan pas sorteren. Je kunt ook
niet schrijven for key in keylist.sort()
, omdat de sort()
methode
geen retourwaarde heeft.
Als je je afvraagt waarom Python iterators boven lists prefereert: het antwoord daarop is dat iterators meer generiek bruikbaar zijn en minder geheugen gebruiken. Het zijn “luie” methodes, omdat ze alleen een item produceren als erom gevraagd wordt.
get()
De get()
methode kun je gebruiken om een waarde uit de dictionary te
halen zelfs als je niet weet of de key die je zoekt wel in de dictionary
zit. Je roept de get()
methode aan met de key die je zoekt als
argument, en het geeft de corresponderende waarde terug als de key
bestaat, of de speciale waarde None
als de key niet bestaat in de
dictionary. Als je in plaats van None
een andere waarde terug wilt
krijgen als de key niet bestaat, dan kun je die waarde meegeven als het
tweede, optionele argument.
fruitmand = {"appel":3,"banaan":5,"kers":50,"druif":0,"mango":2}
appel = fruitmand.get( "appel" )
if appel:
print( "appel is in de mand" )
else:
print( "geen appels in de mand")
aardbei = fruitmand.get( "aardbei" )
if aardbei:
print( "aardbei is in de mand" )
else:
print( "geen aardbei in de mand")
banaan = fruitmand.get( "banaan", 0 )
print( "aantal bananen in de mand:", banaan )
aardbei = fruitmand.get( "aardbei", 0 )
print( "aantal aarbeien in de mand:", aardbei )
Voer de code hierboven uit en bestudeer de uitkomst, omdat wat de code
demonstreert over de get()
methode erg nuttig is. Stel je voor dat een
collectie van items hebt met corresponderende hoeveelheden,
bijvoorbeeld, de inhoud van een fruitmand waarbij de keys de namen van
fruit zijn, en de waardes de hoeveelheden. Als je in de fruitmand
dictionary zoekt met de get()
methode en als tweede argument een nul,
kun je naar een willekeurig stuk fruit zoeken in de mand zonder dat je
eerst moet controleren of het bestaat in de mand, want als je naar een
fruitnaam vraagt die er niet als key in voorkomt, krijg je nul terug, en
dat is precies wat je wilt zien.
De code hieronder bevat een list met woorden. Bouw een dictionary die al deze woorden als key heeft, en als waarde hoe vaak het woord voorkomt in de list. Print daarna de woorden met hun hoeveelheden.
woordlist = ["appel","doerian","banaan","doerian","appel","kers",
"kers","mango","appel","appel","kers","doerian","banaan",
"appel","appel","appel","appel","banaan","appel"]
De code hieronder bevat een string met woorden gescheiden door komma’s. Bouw een dictionary die al deze woorden als key heeft, en als waarde hoe vaak het woord voorkomt in de list. Print daarna de woorden met hun hoeveelheden.
tekst = "appel,doerian,banaan,doerian,appel,kers,kers,mango," + \
"appel,appel,kers,doerian,banaan,appel,appel,appel," + \
"appel,banaan,appel"
De code hieronder bevat een kleine dictionary die vertalingen bevat van Engelse woorden naar Nederlandse. Schrijf een programma dat met behulp van deze dictionary een woord-voor-woord vertaling maakt van de tekst eronder. Een woord dat niet in de dictionary voorkomt, vertaal je niet. De dictionary gebruikt alleen kleine letters, en je kunt de hele tekst naar kleine letters omzetten voordat je de vertaling maakt. Het is aardig als je interpunctie in stand houdt in de vertaling, maar je mag die ook weglaten (het is best veel werk om de interpunctie intact te houden en het heeft niks van doen met dictionaries, dus het is niet belangrijk – het is ook veel gemakkelijker om dit te doen als je eenmaal geleerd hebt om te gaan met reguliere expressies, in hoofdstuk 264). Ik besef heel goed dat de vertaling uitermate slecht is, maar daar gaat het niet om.
engels_nederlands = { "last":"laatst", "week":"week", "the":"de",
"royal":"koninklijk", "festival":"feest", "hall":"hal",
"saw":"zaag", "first":"eerst", "performance":"optreden",
"of":"van", "a":"een", "new":"nieuw", "symphony":"symphonie",
"by":"bij", "one":"een", "world":"wereld", "leading":
"leidend", "modern":"modern", "composer":"componist",
"composers":"componisten", "two":"twee", "shed":"schuur",
"sheds":"schuren" }
zin = "Last week The Royal Festival Hall saw the first \
performance of a new symphony by one of the world's leading \
modern composers, Arthur \"Two-Sheds\" Jackson."