.. module:: afinitats Afinitats ========= Una empresa per trobar parella fa servir un diccionari per guardar les valoracions (nombres enters :math:`\ge 2`) que cada persona ha donat a les parelles amb què s'ha citat. Per exemple: .. literalinclude:: test-afinitats_parelles_afins.txt :language: pycon :lines: 3-9 En la *llista de valoracions* de ``'id1'`` hi ha 4 cites --4 tuples (`ident`, `val`)--, i veiem que ``'id1'`` ha valorat a ``'id2'`` amb un 4, a ``'id3'`` amb un 7, a ``'id4'`` amb un 5, i a ``'id7'`` amb un 9 (la seva màxima valoració). No tothom té el mateix nombre de cites, però tota parella que se cita s'avaluen mútuament. Per exemple, ``'id1'`` ha valorat a ``'id4'`` amb un 5, i ``'id4'`` a ``'id1'`` amb un 9. En aquest exercici implementaràs algunes funcions que ens permetran conèixer la llista de parelles que tenen una bona *afinitat mútua*. És el cas de la parella formada per ``'id1'`` i ``'id7'`` de l'exemple anterior, que s'han valorat entre elles amb les seves màximes valoracions: un 9 de ``'id1'`` a ``'id7'``, i un 8 de ``'id7'`` a ``'id1'``. Dissenya les següents funcions en Python i desa-les al mòdul :mod:`afinitats` (fitxer :file:`afinitats.py`). .. function:: maxima_val(llista_vals) Calcula la valoració màxima i l'identificador a què correspon. :param list llista_vals: llista de valoracions :rtype: (str, int) :return: tupla amb l'identificador i valoració màxima de `llista_vals`. Per simplificar, suposarem que totes les puntuacions de `llista_vals` són diferents. Per exemple: .. literalinclude:: test-afinitats_maxima_val.txt :language: pycon :lines: 3- Disposes dels tests al fitxer :download:`test-afinitats_maxima_val.txt`. | .. function:: parelles_afins(dic_vals, minim_val) Calcul les parelles que tenen una *afinitat mútua* per sobre d'un llindar. :param dict dic_vals: diccionari de valoracions :param int minim_val: valoració mínima :rtype: list :return: llista de parelles que tenen una *afinitat mútua* per sobre de `minim_val`. Més precisament, retorna una llista de tuples de quatre elements (`ident1`, `ident2`, `val12`, `val21`) on: * `ident1` i `ident2` són dos identificadors * `val12` és la valoració d\'`ident1` a `ident2` * `val21` és la valoració d\'`ident2` a `ident1` Però **NOMÉS** afegim la tupla **SI**: * la màxima puntuació d\'`ident1` ha estat per `ident2`, i * la màxima puntuació d\'`ident2` ha estat per `ident1`, i * les puntuacions mútues `val12` i `val21` són superiors o iguals a `minim_val`, i * només si `ident1` :math:`<` `ident2`; és a dir, la parella "afí" (`ident2`, `ident1`) no hi seria, per no aparèixer cada parella dues vegades. .. note:: La llista resultant ha d'estar ordenada creixentment pel primer element de la tupla (per l\'`ident1`). Per exemple, si el diccionari ``dic_vals`` és com el mostrat a l'inici de l'enunciat: .. literalinclude:: test-afinitats_parelles_afins.txt :language: pycon :lines: 11-13 Analitzant la crida anterior veiem que en ``dic_vals`` la màxima puntuació de ``'id1'`` és per ``'id7'`` (un ``9``), i la màxima puntuació de ``'id7'`` és per ``'id1'`` (un ``8``), i totes dues són :math:`\ge` ``7``. El mateix succeeix amb ``'id5'`` i ``'id6'``. Disposes dels tests al fitxer :download:`test-afinitats_parelles_afins.txt`. .. Nota:: És obligatori que aquesta funció faci servir la funció anterior :func:`maxima_val`.