Drop links or images here to add them to the editor.

Een bibliotheek heeft boeken. Ieder boek heeft een schrijver, die je kunt identificeren door achter- en voornaam. Boeken hebben een titel. Boeken hebben ook een locatienummer dat aangeeft waar ze staan in de bibliotheek. De bibliothecaris wil kunnen vinden waar een boek staat als de schrijver en titel gekend zijn, en wil ook alle boeken kunnen afdrukken die van een bepaalde schrijver zijn. Welke data structuur kun je gebruiken om de boeken in op te slaan?

Antwoord

Gebruik een dictionary (dict) die elke schrijver afbeeldt op een andere dictionary (dict), met de titels van de boeken van die schrijver en hun locatienummers. De schrijver zelf stel je voor als een tuple met de achternaam en de voornaam: een tuple is onveranderlijk en kan dus als sleutel van een dictionary gebruikt worden, wat met een list niet kan.

Zo krijg je beide dingen die de bibliothecaris wil. Om één boek te vinden zoek je eerst de schrijver op en daarna de titel. Om alles op te lijsten wat de bibliotheek van een schrijver heeft, neem je de sleutels van de binnenste dictionary van die schrijver.

Opgave

Data over de boeken van een bibliotheek worden voorgesteld als een lijst (list) met boeken waarin elk boek wordt voorgesteld als een tuple met vier elementen: i) de achternaam van de schrijver (str), ii) de voornaam van de schrijver (str), iii) de titel van het boek (str) en iv) het locatienummer van het boek (int). Gevraagd wordt:

Voorbeeld

>>> boeken = [
...     ('Adams', 'Douglas', "The Hitchhiker's Guide to the Galaxy", 42),
...     ('Adams', 'Douglas', 'The Restaurant at the End of the Universe', 43),
...     ('Adams', 'Douglas', 'Life, the Universe and Everything', 44),
...     ('Rowling', 'Joanne', "Harry Potter and the Philosopher's Stone", 271),
...     ('Rowling', 'Joanne', 'Harry Potter and the Chamber of Secrets', 272),
...     ('Tolkien', 'John', 'The Hobbit', 137),
...     ('Spronck', 'Pieter', "The Coder's Apprentice", 512),
... ]
>>> bibliotheek = list2dict(boeken)
>>> bibliotheek[('Tolkien', 'John')]
{'The Hobbit': 137}
>>> bibliotheek[('Rowling', 'Joanne')]
{"Harry Potter and the Philosopher's Stone": 271, 'Harry Potter and the Chamber of Secrets': 272}
>>> locatie(bibliotheek, 'Adams', 'Douglas', 'Life, the Universe and Everything')
44
>>> locatie(bibliotheek, 'Adams', 'Douglas', 'The Long Dark Tea-Time of the Soul') is None
True
>>> titels(bibliotheek, 'Adams', 'Douglas')
['Life, the Universe and Everything', "The Hitchhiker's Guide to the Galaxy", 'The Restaurant at the End of the Universe']
>>> titels(bibliotheek, 'Pratchett', 'Terry')
[]