Tema 8: Diccionaris
Objectius i argument
Aquest tema tanca la sèrie de temes dedicada als tipus de dades estructurats de Python. Els diccionaris són estructures associatives que permeten implementar correspondències clau-valor de manera senzilla i són una eina de gran potència. El conjunt de tipus predefinits de Python (strings, llistes, tuples i diccionaris) constitueix una de les seves característiques més apreciades.
Resultats d'aprenentatge
Després d'assolir aquest tema una estudianta ha de:
Conceptes clau
Diccionari. Correspondència. Clau. Valor associat a una clau. Inserció i esborrat d'elements. Constructors de diccionaris. Conjunt de claus i multiconjunt de valors.
Referència principal
- How to Think Like a Computer Scientist: Learning with Python 2nd Edition: capítol 12 (excepte apartats 12.5 i 12.8).
Referències complementàries
- El capítol sobre diccionaris del tutorial de Python és una lectura a un nivell similar a la referència principal que pot complementar-la molt bé.
- L'apartat sobre diccionaris del manual de Python és la referencia última sobre les operacions diponibles per aquest tipus de dades.
- Exemples de diccionaris extret de Dive into Python. Python from novice to pro.
- Tuples, Lists and Dictionaries, extret de http://www.sthurlow.com/python/lesson06/
Exercicis obligatoris de teoria
Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.
EOT 8.1
Escriviu un programa anomenat aparicionsLletres.py que llegeixi una cadena donada per la línia de comandes i retorni una taula amb les lletres de l'abecedari per ordre alfabètic que apareguin en la cadena donada, amb el nombre d'aparicions per cada lletra. Un exemple d'execució del vostre programa podria ser, donada la següent entrada, el vostre programa hauria de retornar:
$python aparicionsLletres.py "hola adeu"
a 2
d 1
e 1
h 1
l 1
0 1
u 1
EOT 8.2
Escriviu un programa anomenat aparicionsLletresFitxer.py que llegeixi un fitxer donat per la línia de comandes i escrigui en un fitxer anomenat resultat.txt una taula amb les lletres de l'abecedari per ordre alfabètic que apareguin en el fitxer donat, amb el nombre d'aparicions per cada lletra.
EOT 8.3
Escriviu una funció anomenada diccioCadenes que, donada una llista de cadenes, retorni un diccionari on la clau per cada valor sigui la primer paraula de cada cadena. Per exemple, donada la següent llista:
["una frase", "dos frases", "tres frases"]
La funció diccioCadenes hauria de retornar el següent diccionari:
{"una": "una frase", "dos": "dos frases", "tres": "tres frases"}
EOT 8.4
Escriviu una funció anomenada diccioLlistes que, donada una llista de llistes, retorni un diccionari on la clau per cada valor sigui el primer element de cada subllista, i el valor emmagatzemat sigui la resta de la llista. Per exemple, donada la següent llista:
[[1, 2, 3], ["un", "dos", "tres"]]
La funció diccioLlistes hauria de retornar el següent diccionari:
{1: [2, 3], "un": ["dos", "tres"]}
EOT 8.5
Escriviu un programa que, donat un nom de fitxer per la línia de comandes, retorni un diccionari on la clau per cada element, sigui la primera paraula de la línia, i el valor sigui un nou diccionari amb clau les lletres de l'abecedari i valor el nombre d'aparicions de cada lletra en la línia.
EOT 8.6
Escriviu una funció anomenada ordenaDiccio que, donat un diccionari, retorna el elements del diccionari ordenats respecte la seva clau.
EOT 8.7
Escriviu un programa anomenat complicacioFinal.py que llegeixi per la línia de comandes el nom de 3 fitxers i retorni un diccionari amb clau el nom de cada fitxer i per valor una tupla amb el primer valor el nombre de lletres del fitxer, amb segon valor el nombre de vocals del fitxer, per tercer valor el nombre de paraules del fitxer, per quart valor la llista de paraules del fitxer, per cinquè valor la llista de línies del fitxer i per sisè valor una cadena amb el contingut del fitxer.
Exercicis obligatoris de laboratori
Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.
EOL 8.1
Volem muntar un sistema d'autentificació d'usuaris. Per tal de fer això cal desenvolupar un menú on ens permeti crear, esborrar i editar usuaris amb tota la seva informació referent.
A partir d'un diccionari d'usuaris hem de guardar per cada un el nom, l'adreça i la paraula clau que farà servir per accedir al sistema. En el menú tindrem les següents opcions :
- Afegir un usuari : Es demana el nom d'usuari, el nom complert, el correu electrònic, el telèfon, l'adreça i la paraula clau
- Esborrar un usuari : Es demana el nom d'usuari
- Modificar un usuari : Es demana el nom d'usuari i es permet canviar les dades
Un cop tenim la funcionalitat bàsica afegirem guardar a disc tota la informació de manera que poguem tenir unes dades. Per això afegirem al menú :
- Guardar a disc : Es demana el nom del fitxer que s'usarà i es guarda en ell la informació del diccionari.
- Llegir de disc : Es demana el nom del fitxer que es llegira i crearà el diccionari
Finalment crearem un altra programa en python que ens demani una nom d'usuari i una paraula clau i ens indiqui si està validat. Per tal de saber quin fitxer de dades s'usa es passarà per parametre.
[OPCIONAL] De forma opcional caldria buscar una manera de guardar la paraula clau d'una forma encriptada en el fitxer de dades.
Exercicis optatius
EOP 8.1
Tracteu de familiaritzar-vos amb els diccionaris. Primer de tot, mireu quin nom de tipus dona Python als diccionaris ("type name"). Executeu alguna comanda d’ajuda per tal de saber els mètodes disponibles en Python per al tractament d’objectes de tipus diccionari. Intenteu conèixer el funcionament de varis d’aquests mètodes, per exemple: (values(), clear(), get(), update(), itervalues(),…). Amb l’ajuda comproveu quins paràmetres han de contindré i quin valor i tipus retornen.
EOP 8.2
Mitjançant el disseny d'una funció, realitzeu i guardeu en una variable de tipus diccionari totes les taules de multiplicar dels 100 primers números enters. Crideu aquesta funció fent que el resultat l’imprimeixi en un fitxer de sortida, el nom del qual l’haurà entrat a l’usuari dins de la línea de comandes, com a paràmetre a l’hora de cridar al script.
EOP 8.3
Dissenyeu un programa que simuli el control de inventari del nostre magatzem de ferreteria. Utilitzeu un diccionari per guardar els productes i les quantitats que disposem en inventari de cadascun d'aquests productes.
Inicialment tindrem els següents productes i quantitats per defecte: 25 cargols M5x20, 67 cargols TORX M4x20 i 109 femelles M6.
Creeu un menú d’entrada on:
- L’usuari podrà crear un nou producte (comprovant que abans no existia) o eliminar un d’existent.
- L’usuari podrà consultar el inventari d’un producte
- L’usuari podrà afegir o treure inventari d’un producte
- L’usuari podrà extreure, en un fitxer que especificarà, un informe de tots els productes i quantitats existents
EOP 8.4
Dissenyeu una funció en Python que donat una llista de 5 números enters i una tupla que indiqui posicions en fila i columna d’aquests 5 números, creí una matriu dispersa “sparse matrix”, utilitzant diccionaris per a representar-la. La mida de la matriu serà sempre de 5 files i 5 columnes.
EOP 8.5
Modifiqueu la funció anterior per tal de que la matriu pugui tenir tantes files i columnes com l’usuari cregui convenient. També feu una funció que imprimeixi la matriu per pantalla.
EOP 8.6
Dissenyeu el una funció que realitzi l’intercanvi del parell valor-clau per a tots els elements d'un diccionari. Aquesta funció retornarà un altre diccionari on els valors inicials siguin les claus del diccionari a retornar i les claus del diccionari inicial seran els valors del diccionari a retornar.
EOP 8.7
Dissenyeu un programa que, donat un fitxer amb informació sobre l'estoc d'un magatzem de carn i peix, analitzi el contingut i mostri els resultats per pantalla. El programa ha de llegir el nom del fitxer per la línia de comandes. Si el fitxer no existeix, s'ha d'informar a l'usuari.
El programa ha de llegir cada línia i crear un diccionari per la carn i un altre diccionari pel peix, on la clau serà el nom del producte i el valor la quantitat que en tenim en estoc. Finalment, ha de mostrar el contingut de cada diccionari, ordenat, per pantalla. Cada línia conté el tipus del producte ( C --> carn, P --> peix), un & de separació, el nom del producte, una @ de separació i la quantitat que en disposem.
Exemple:
\estoc "magatzem"
{
C&pollastre@2
C&conill@25
C&vedella@10
P&bacalla@5
}