Classe Registre =============== Mètodes principals ------------------ .. py:module:: registres Implementeu la classe :py:class:`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. .. py:class:: Registre(pob, an) .. rubric:: Atributs: .. py:attribute:: poblacio Nom de la població (:py:class:`str`) inicialitzat amb el paràmetre `pob`. .. py:attribute:: any_naix Any de naixement (:py:class:`int`) inicialitzat amb el paràmetre `an`. .. rubric:: Mètodes .. py:method:: inscriure(data, nom) Afegeix un naixement en la data `data` (:py:class:`datetime.date`) d'una persona de nom `nom` (:py:class:`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 :py:class:`Registre` i deseu-la al fitxer :file:`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: .. literalinclude:: test-registre.txt :language: python :end-before: --fi-enunciat Disposeu d'un fitxer amb un joc de proves al fitxer :download:`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 :py:class:`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: .. literalinclude:: test-registre_iter.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de proves al fitxer :download:`test-registre_iter.txt `. Iterar sobre noms ----------------- Afegiu a la classe :py:class:`Registre` el mètode :py:meth:`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: .. literalinclude:: test-registre_iter_2.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat 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 :py:class:`set` per guardar-ne només els no repetits. Disposeu de jocs de proves al fitxer :download:`test-registre_iter_2.txt `. .. note:: Trobareu una solució de tot l'exercici al fitxer :download:`registres.py`.