2. Afinitats¶
Una empresa per trobar parella fa servir un diccionari per guardar les valoracions (nombres enters \(\ge 2\)) que cada persona ha donat a les parelles amb què s’ha citat. Per exemple:
>>> dic_vals = {'id1': [('id2',4), ('id3',7), ('id4',5), ('id7',9)],
... 'id2': [('id1',6), ('id3',2), ('id5',8)],
... 'id3': [('id1',5), ('id2',8)],
... 'id4': [('id1',9), ('id5',6), ('id6',7)],
... 'id5': [('id2',3), ('id4',5), ('id6',7), ('id7',6)],
... 'id6': [('id4',4), ('id5',7), ('id7',3)],
... 'id7': [('id1',8), ('id5',7), ('id6',4)] }
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
afinitats (fitxer afinitats.py).
- afinitats.maxima_val(llista_vals)¶
Calcula la valoració màxima i l’identificador a què correspon.
- Paràmetres:
llista_vals (list) – llista de valoracions
- Tipus de retorn:
- Retorna:
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:
>>> r = maxima_val([('id2',4), ('id3',7), ('id4',5), ('id7',9)]) >>> r ('id7', 9) >>> r = maxima_val([('id1',6), ('id3',2), ('id5',8)]) >>> r ('id5', 8) >>> r = maxima_val([('id1',5), ('id2',8)]) >>> r ('id2', 8) >>> r = maxima_val([('id1',8), ('id5',7), ('id6',4)]) >>> r ('id1', 8)
Disposes dels tests al fitxer
test-afinitats_maxima_val.txt.
- afinitats.parelles_afins(dic_vals, minim_val)¶
Calcul les parelles que tenen una afinitat mútua per sobre d’un llindar.
- Paràmetres:
- Tipus de retorn:
- Retorna:
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 \(<\) ident2; és a dir, la parella «afí» (ident2, ident1) no hi seria, per no aparèixer cada parella dues vegades.
Nota
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:>>> r = parelles_afins(dic_vals, 7) >>> r [('id1', 'id7', 9, 8), ('id5', 'id6', 7, 7)]
Analitzant la crida anterior veiem que en
dic_valsla màxima puntuació de'id1'és per'id7'(un9), i la màxima puntuació de'id7'és per'id1'(un8), i totes dues són \(\ge\)7. El mateix succeeix amb'id5'i'id6'.Disposes dels tests al fitxer
test-afinitats_parelles_afins.txt.Nota
És obligatori que aquesta funció faci servir la funció anterior
maxima_val().