Duizend klikken
Bij tien klikken zie je welke wegen de surfer loopt. Welke pagina het belangrijkst is, zie je pas als je telt, net als bij de dobbelsteen: laat hem duizend keer klikken, en tel hoe vaak hij op elke pagina komt.
Voorspel
bezocht = {"A": 0, "B": 0, "C": 0, "D": 0}
for pagina in ["A", "C", "A", "B", "C"]:
bezocht[pagina] = bezocht[pagina] + 1
print(bezocht)
print(bezocht["A"] / 5)
Wat print dit?
Antwoord
{'A': 2, 'B': 1, 'C': 2, 'D': 0}
0.4
A staat twee keer in de lijst van vijf, dus de surfer was 0,4 van de tijd op A.
Zo werkt het
De dictionary bezocht telt hoe vaak de surfer op elke pagina komt. Met
for p in web: zet je eerst elke pagina op 0. Deel je de telling door het
aantal klikken, dan weet je welk deel van de tijd hij op elke pagina
doorbrengt.
Onderzoek
- Draai de code. Welke pagina's zijn het populairst?
- Pagina D krijgt 0. Waarom?
- Laat de surfer op D beginnen:
pagina = "D". Krijgt D nu wel bezoek? - Zet
"E": []in het web, en laat C naar A én E linken:"C": ["A", "E"]. Wat gebeurt er als je de code draait?
Antwoorden
- A en C, allebei rond de 0,4. B krijgt ongeveer 0,2: alleen A linkt naar B, en vanaf A gaat de surfer maar de helft van de keren naar B.
- Geen enkele pagina linkt naar D. De surfer komt er dus nooit.
- Nee. De loop telt een pagina pas als de surfer er na een klik op uitkomt. Vanaf D klikt hij naar C, en daarna komt hij nooit meer terug.
- Python stopt met een foutmelding, zie
Er gaat iets mis. Zodra de surfer op E komt, staat hij
op een pagina zonder links, en
random.choicekan uit een lege lijst niets kiezen.
Opdracht: de populairste pagina
Een zoekmachine zet de populairste pagina bovenaan. Zoek in de telling van een surfer de pagina met het meeste bezoek, en print hem:
C is het populairst
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print elke pagina met haar telling.
- Houd de beste pagina tot nu toe bij: zet vóór de loop
beste = "A", en zet in de loopbeste = palsbezocht[p]groter is danbezocht[beste]. Print na de loop de zin metbesteerin. - Verander de telling van B in 500, en draai opnieuw. Nu moet B bovenaan staan.
Tip
Zegt hij altijd A? Kijk of je bezocht[p] vergelijkt met bezocht[beste], en
niet met beste zelf: beste is de naam van een pagina, geen getal.
Antwoord
bezocht = {"A": 401, "B": 196, "C": 403, "D": 0}
beste = "A"
for p in bezocht:
print(p, bezocht[p])
if bezocht[p] > bezocht[beste]:
beste = p
print(beste, "is het populairst")
C wint net van A. Bij een volgende run van de surfer kan het andersom zijn: ze liggen allebei rond de 0,4.
Er gaat iets mis
IndexError: Cannot choose from an empty sequence
Oorzaak: de surfer staat op een pagina zonder links. web[pagina] is dan
een lege lijst, en random.choice kan uit een lege lijst niets kiezen.
Oplossing: geef elke pagina minstens één link, of laat de surfer springen als er geen links zijn.
# FOUT
import random
web = {"A": ["E"], "E": []}
pagina = random.choice(web["E"])
# GOED
import random
web = {"A": ["E"], "E": []}
if len(web["E"]) > 0:
pagina = random.choice(web["E"])
else:
pagina = random.choice(list(web))
Door naar de surfer springt soms.