Votacions

Els oients d’una cadena de ràdio voten les tres cançons emeses que més els han agradat. Les votacions es desen en un fitxer de vots a cançons on cada línia correspon al vol d’un oient i conté el títol de, com a màxim, tres cançons, separades entre elles per una coma i un sol espai en blanc. Un exemple d’aquest tipus de fitxer és vots_radio.txt:

Cargol treu banya, El gripau blau, En Pinxo i en Panxo
La lluna la pruna, En Pinxo i en Panxo, La pastoreta
Cargol treu banya
La lluna la pruna, El Ball de Sant Ferriol
Plou i fa sol, La lluna la pruna
La lluna la pruna, Plou i fa sol, En Jan petit

Fixa’t que hi ha oients que només han votat una o dues cançons, d’altres tres.

Volem saber quants vots ha tingut cada cançó i volem desar aquest resultat en un fitxer de resultats. Per exemple, el resultat de la votació a partir de les dades de vots_radio.txt podria ser el següent o qualsevol llistat equivalent (l’ordre en què s’escriguin les cançons no és important):

1*El Ball de Sant Ferriol
1*El gripau blau
1*En Jan petit
1*La pastoreta
2*Cargol treu banya
2*En Pinxo i en Panxo
2*Plou i fa sol
4*La lluna la pruna

Per resoldre aquest exercici cal generar un diccionari a partir del fitxer de vots a cançons on la clau sigui el títol d’una cançó i el valor el nombre de vots que ha obtingut i, a continuació, escriure el fitxer de resultats usant aquest diccionari.

Dissenya les funcions següents i desa-les al mòdul votacions (fitxer votacions.py):

votacions.actualitza_resultats(resultats, vots)

resultats és un diccionari de vots a cançons en què les claus són títols de cançons i els valors el nombre de vots que té la cançó.

vots és una llista de títols de cançons.

Modifica resultats sumant un al nombre de vots de cada cançó de vots si la cançó ja hi és, o afegint la cançó amb un vot si no hi és.

Per exemple,


>>> resultats = {}

>>> actualitza_resultats(resultats, ['Cargol treu banya', 'El gripau blau', 'En Pinxo i en Panxo'])

>>> if resultats != {
...     'Cargol treu banya': 1,
...     'El gripau blau': 1,
...     'En Pinxo i en Panxo': 1,
... }: print(resultats)

>>> actualitza_resultats(resultats, ['La lluna la pruna', 'En Pinxo i en Panxo', 'La pastoreta'])

>>> if resultats != {
...     'Cargol treu banya': 1,
...     'El gripau blau': 1,
...     'En Pinxo i en Panxo': 2,
...     'La lluna la pruna': 1,
...     'La pastoreta': 1,
... }: print(resultats)

Trobaràs més tests al fitxer test-actualitza_resultats.txt.


votacions.fes_recompte(fvots)

fvots és el nom d’un fitxer de vots a cançons.

Retorna un diccionari de vots a cançons (vegeu actualitza_resultats()) calculat a partir de les dades de fvots.

Per exemple,


>>> vots = """\
... Cargol treu banya, El gripau blau, En Pinxo i en Panxo
... La lluna la pruna, En Pinxo i en Panxo, La pastoreta
... Cargol treu banya
... La lluna la pruna, El Ball de Sant Ferriol
... Plou i fa sol, La lluna la pruna
... La lluna la pruna, Plou i fa sol, En Jan petit
... """
>>> with open('vots_radio.txt', 'w') as f: a = f.write (vots)

>>> resultats = fes_recompte('vots_radio.txt')

>>> if resultats != {
...     'El Ball de Sant Ferriol': 1,
...     'El gripau blau': 1,
...     'En Jan petit': 1,
...     'La pastoreta': 1,
...     'Cargol treu banya': 2,
...     'En Pinxo i en Panxo': 2,
...     'Plou i fa sol': 2,
...     'La lluna la pruna': 4,
... }: print(resultats)

Trobaràs més tests al fitxer test-fes_recompte.txt.


votacions.escriu_resultats(fresultats, resultats)

fresultats és el nom del fitxer on escriure els resultats

resultats és un diccionari de vots a cançons (vegeu actualitza_resultats())

Escriu al fitxer fresultats cada una de les cançons de resultats i el seu nombre de vots en una línia. El format de la línia ha de ser primer el nombre de vots, seguit d’un asterisc i seguit del títol de la cançó.

Per exemple,


>>> resultats = {
...     'El Ball de Sant Ferriol': 1,
...     'El gripau blau': 1,
...     'En Jan petit': 1,
...     'La pastoreta': 1,
...     'Cargol treu banya': 2,
...     'En Pinxo i en Panxo': 2,
...     'Plou i fa sol': 2,
...     'La lluna la pruna': 4,
... }

>>> escriu_resultats('resultats.txt', resultats)

>>> with open('resultats.txt', 'r') as f:
...    sorted(f.readlines())
['1*El Ball de Sant Ferriol\n', '1*El gripau blau\n', '1*En Jan petit\n', '1*La pastoreta\n', '2*Cargol treu banya\n', '2*En Pinxo i en Panxo\n', '2*Plou i fa sol\n', '4*La lluna la pruna\n']

Trobaràs més tests al fitxer test-escriu_resultats.txt.


votacions.votacions(fvots, fresultats)

fvots és el nom d’un fitxer de vots a cançons.

fresultats és el nom d’un fitxer on escriure els resultats.

Escriu a fresultats el resultats dels vots a cançons recollits a fvots.

Per exemple,


>>> vots = """\
... Cargol treu banya, El gripau blau, En Pinxo i en Panxo
... La lluna la pruna, En Pinxo i en Panxo, La pastoreta
... Cargol treu banya
... La lluna la pruna, El Ball de Sant Ferriol
... Plou i fa sol, La lluna la pruna
... La lluna la pruna, Plou i fa sol, En Jan petit
... """
>>> with open('vots_radio.txt', 'w') as f: a = f.write (vots)

>>> votacions('vots_radio.txt', 'resultats.txt')

>>> with open('resultats.txt', 'r') as f:
...    sorted(f.readlines())
['1*El Ball de Sant Ferriol\n', '1*El gripau blau\n', '1*En Jan petit\n', '1*La pastoreta\n', '2*Cargol treu banya\n', '2*En Pinxo i en Panxo\n', '2*Plou i fa sol\n', '4*La lluna la pruna\n']

Trobaràs més tests al fitxer test-votacions.txt.

Solució

Disposes de solucions al fitxer votacions.py