La funció par_freq_dicc(dPars) donat un diccionari dPars on les claus són paraules i els valors són enters que representen el número de vegades que han aparegut en un texte, obté i retorna la paraula més repetida i el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula lexicogràficament més petita. Se suposa que el diccionari no és buit.
>>> d = { 'hola': 3, 'adeu': 4, 'tal': 2, 'ada': 1, 'qual': 4 } >>> par_freq_dicc(d) ('adeu', 4)
A continuació hi han dues posibles solucions:
Opció A. Recórrer el diccionari amb un for clau in dicc:
def par_freq_dicc(dPars):
nMax = 0
for par in dPars:
n = dPars[par]
if n > nMax or (n == nMax and par < parMax):
nMax = n
parMax = par
return (parMax, nMax)
Opció B. Ordenar TOTA la llista de parelles (clave, valor) per valor:
import operator # Ens permet fer servir itemgetter per
# determinar com ordena la funció sorted
def par_freq_dicc_B(dPars):
li = dPars.items()
# Per ordenar per aparicions (decreixent) i, en cas d'empat,
# per paraula (lexicogràficament creixent):
# [A]. Ordena per paraula en ordre creixent
# itemgetter(0) obté la primera component de la parella (paraula)
ls1 = sorted(li, key=operator.itemgetter(0))
# [B]. Ordena per aparicions en ordre decreixent (reverse=True)
# itemgetter(1) obté la segona component de la parella (aparicions)
ls2 = sorted(ls1, key=operator.itemgetter(1), reverse=True)
return (ls2[0][0], ls2[0][1])
Dissenya una funció par_freq_string(s) que donat un string s, trobi la paraula més repetida, i retorni quina és i quin és el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula més petita. Pots suposar que el string s conté com a mínim una paraula.
>>> par_freq_string('Príamo y un viejo heraldo se dirigen hacia el \ campamento aqueo: en el camino encuentran a \ Hermes (enviado por Zeus), que los ayuda a \ pasar inadvertidos hasta la tienda de \ Aquiles. Príamo ruega a Aquiles le entregue \ el cadáver de Héctor y ofrece regalos, que \ Aquiles conmovido acepta. Luego Príamo pide a \ Aquiles un lecho para que lo acoja el sueño, \ y el hijo de Peleo ordena que se dispongan \ dos lechos; uno para Príamo y otro para su \ heraldo. Después, Aquiles da, por petición \ del anciano Príamo, once días para los \ funerales de Héctor, de modo que el duodécimo \ día los troyanos volverían a pelear') ('el', 6)
Completa el codi de la funció que tens a continuació:
def par_freq_string(s): # Diccionari inicial sense paraules: d = {} # Obtenir la llista de paraules a partir del stgring s: lp = s.split() for par in lp: # Comprovar si la paraula par és al diccionari: # Retorna el resultat obtingut per la funció par_freq_dicc
Dissenya una funció par_freq_fitxer(nomFitxer) que donat el nom d’un fitxer nomFitxer, trobi la paraula més repetida al texte del fitxer, i retorni quina és i quin és el número de vegades que es repeteix. Si n’hi ha més d’una retorna la paraula més petita. Pots suposar que el texte del fitxer nomFitxer conté com a mínim una paraula.
S’ha de fer servir la funció anterior par_freq_string. El fitxer suzanne.txt conté la lletra de la cançó Suzanne de Leonard Cohen, i el fitxer miranda.txt el texte del tema Priscilla de Miranda Lambert.
>>> par_freq_fitxer('suzanne.txt')
('And', 20)
>>> par_freq_fitxer('miranda.txt')
('to', 26)
A continuació hi ha una posible solució:
def par_freq_fitxer(infile):
with open(infile, 'r') as f:
texte = f.read()
return par_freq_string(texte) # es retorna el resultat de la funció
# O, en dos passos:
# parMax, nMax = par_freq_string(texte)
# return (parMax, nMax)