Hospital

Un fitxer conté la relació de pacients ingressats en un hospital. A cada línia del fitxer hi ha el nom i dos cognoms de la persona ingressada, el seu DNI, el número de l’habitació on s’està i la data d’ingrés en format dd/mm/aaaa. Dins cada línia, les dades estan separades per punt-i-coma (';'). Per exemple [1], el fitxer prova.txt és el següent:

Anna Perejoan Puigmartinez;34567890;123;10/10/2013
Roger Moll Verat;34676785;124;15/11/2013
Maria Sofie Dentetes Conill;67345123;234;16/11/2013
Pernile Gual Permanent;34123456;678;9/10/2013
Narcis Vallrobat Fanalet;45678678;212;30/9/2013

Deseu les funcions següents al fitxer hospital.py.

  1. Dissenyeu la funció crea_dict() que crea un diccionari de pacients a partir de les dades del fitxer. La clau del diccionari és el DNI del pacient i el valor és una tupla formada pel nom complet del pacient, el número d’habitació i la data d’ingrés. Tots els elements de la tupla han de ser strings [2].

    hospital.crea_dict(nomfitxer)

    A partir del fitxer , crea i retorna un diccionari

    {dni: (nom complet, numero habitació, data ingrés)}

    Per exemple:

    >>> d = hospital.crea_dict('prova.txt')
    >>> d == {
    ... '34567890': ('Anna Perejoan Puigmartinez', '123', '10/10/2013'),
    ... '34676785': ('Roger Moll Verat', '124', '15/11/2013'),
    ... '67345123': ('Maria Sofie Dentetes Conill', '234', '16/11/2013'),
    ... '34123456': ('Pernile Gual Permanent', '678', '9/10/2013'),
    ... '45678678': ('Narcis Vallrobat Fanalet', '212', '30/9/2013'),
    ... }
    True
    
  2. Dissenyeu la funció num_hab() que, a partir d’un diccionari de pacients com el descrit a la pregunta anterior i el dni d’un pacient, retorni el número de la seva habitació (un enter) o -1 si el dni no consta al diccionari [2]:

    hospital.num_hab(dicc, dni)

    Retorna el número d’habitació del pacient de dni donat o -1 si no és un dni de pacient de l’hospital.

    Per exemple:

    
    >>> hospital.num_hab(d, '34567890')
    123
    >>> hospital.num_hab(d, '666')
    -1
    
  3. Dissenyeu la funció crea_llista() que, a partir d’un diccionari de pacients com el descrit a la primera pregunta i d’una data, retorna una llista de tuples on cada tupla correspon un pacient i està formada pel dni i el nombre de dies que el pacient duu ingressat fins la data donada. La llista ha d’estar ordenada pel dni [2].

    hospital.crea_llista(dicc, data)

    Crea i retorna una llista (dni, nombre de dies d’ingrés).

    Per exemple:

    
    >>> import datetime
    
    >>> datadoctest = datetime.date(2014, 2, 10)
    >>> llista = hospital.crea_llista(d, datadoctest)
    >>> sorted(llista)
    [('34123456', 124), ('34567890', 123), ('34676785', 87), ('45678678', 133), ('67345123', 86)]
    

    Per a calcular el nombre de dies, podeu utilitzar funcions del mòdul datetime. En concret,

    • la classe datetime.date, que permet crear una data a partir de tres enters (any, mes, dia), així com restar dues dates, obtenint un interval de temps (datetime.timedelta);

    • d’un interval de temps se’n pot consultar els dies o els segons (atributs days i seconds, respectivament).

  4. Dissenyeu la funció habitacions_cronics() que, a partir d’un diccionari de pacients com el descrit a la primera pregunta, una llista com la descrita a la pregunta anterior, i un valor llindar, retorni la llista de les habitacions on hi ha un o més pacients que estan ingressats a l’hospital des de fa més de llindar dies. La llista retornada ha de ser una llista d’enters, ordenada de forma creixent i que no contingui repetits [2].

    hospital.habitacions_cronics(d, llista, llindar)

    Retorna la llista d’habitacions en les que hi ha pacients que porten ingressats més de llindar dies.

    Per exemple:

    
    >>> hospital.habitacions_cronics(d, llista, 100)
    [123, 212, 678]
    
    >>> hospital.habitacions_cronics(d, llista, 200)
    []
    

Solució

Disposeu d’una solució al fitxer hospital.py. Us encoratgem a resoldre el problema abans de mirar la solució. Useu-la per comparar-la amb la vostra.

Notes