Classe Registre

Mètodes principals

Implementeu la classe Registre especificada a continuació, que permet de representar informació sobre els naixements en una població durant un any. Per cada dia es guarda una llista dels noms de les persones nascudes aquell dia en l’ordre en el qual s’han inscrit.

class registres.Registre(pob, an)

Atributs:

poblacio

Nom de la població (str) inicialitzat amb el paràmetre pob.

any_naix

Any de naixement (int) inicialitzat amb el paràmetre an.

Mètodes

inscriure(data, nom)

Afegeix un naixement en la data data (datetime.date) d’una persona de nom nom (str). El naixement s’inscriu al final de la llista dels naixements ja existents aquell dia.

Aquesta classe ha de suportar les operacions següents:

Operació

Resultat

r[data]

Retorna una llista dels noms de les persones nascudes en la data donada que consten al registre r. Si no hi ha cap persona nascuda en la data donada, retorna la llista buida.

len(r)

Retorna el nombre de dates en les que hi ha algun naixement.

Implementeu la classe Registre i deseu-la al fitxer registre.py. Tingueu en compte que serà necessari un atribut privat per a emmagatzemar els noms de cada data. Utilitzeu un diccionari en el qual les claus siguin dates i els valors, llistes de noms. Aquest diccionari serà inicialment buit i només emmagatzemarà dates per les quals hi hagi algun nom.

Vegeu per exemple:

>>> from registres import Registre
>>> r = Registre('Barcelona', 2022)
>>> r.poblacio
'Barcelona'
>>> r.any_naix
2022
>>> len(r)
0
>>> from datetime import date
>>> d1 = date(2022, 2, 23)
>>> d2 = date(2022, 5, 1)
>>> r.inscriure(d1, 'Tom')
>>> r.inscriure(d1, 'Lluís')
>>> r.inscriure(d1, 'Marc')
>>> r.inscriure(d2, 'Marc')
>>> r.inscriure(d2, 'Marc')
>>> r.inscriure(d2, 'Ali')
>>> len(r)
2
>>> r[d1]
['Tom', 'Lluís', 'Marc']
>>> r[d2]
['Marc', 'Marc', 'Ali']

Disposeu d’un fitxer amb un joc de proves al fitxer test-registre.txt.

Iterar sobre dates

En un intèrpret de python, intenteu iterar sobre dates del registre. És possible? Per què?

Afegir a la classe Registre el mètode adient per a que la classe sigui iterable per dates de naixement. Vegeu per exemple per la instància r definida en els tests anteriors:

>>> for data in r:
...     print(data,':',r[data])
...
2022-02-23 : ['Tom', 'Lluís', 'Marc']
2022-05-01 : ['Marc', 'Marc', 'Ali']

Disposeu de jocs de proves al fitxer test-registre_iter.txt.

Iterar sobre noms

Afegiu a la classe Registre el mètode iter_noms() que permet iterar sobre els noms de persona que s’han registrat durant l’any ordenats per ordre alfabètic i sense repeticions. Vegeu com a exemple, per registre r creat en els tests anteriors:

>>> for nom in r.iter_noms():
...     print(nom, end = '-')
...
Ali-Lluís-Marc-Tom-

Una estratègia possible per abordar aquest problema és utilitzar la funció itertools.chain.from_iterable per crear un iterador de tots els noms i un set per guardar-ne només els no repetits.

Disposeu de jocs de proves al fitxer test-registre_iter_2.txt.

Nota

Trobareu una solució de tot l’exercici al fitxer registres.py.