DICCIONARIOS Y SUS MÉTODOS

PINAR DE ALTURA EN PASAGIRÓN, MONTES DE ARICO, SUR DE TENERIFE.

      Entramos con los DICCIONARIOS, DICT,  que será la última estructura de colección de datos que vamos a estudiar. Como siempre, comenzamos por conceptualizar el objeto.
Un diccionario en Python constituye una estructura o colección  mutable y desordenada de datos. Cada dato constituye a su vez un par de elementos denominados key (clave) y value (valor) vinculados entre sí mediante el operador de los dos puntos, :, y que se muestran separados entre sí mediante comas, de tal manera que la key (clave) debe ser única y su función principal es la de permitirnos el acceso a su value (valor) asignado.
Recordemos aquí las concomitancias que encontramos con los conjuntos, el objeto set, pues al igual que en ellos los datos se almacenan de forma desordenada, de acuerdo a los binarios criterios del intérprete de Python, así como su sintaxis de llave, {}. que distingue de un vistazo un tipo de colección de datos de otro.
No olvidemos, insistimos una vez más que, como ocurre con todas las demás secuencias, no se almacenan objetos propiamente dichos sino referencias a esos mismos objetos, de tal modo que en los diccionarios, una key (clave) es una referencia de objeto que en virtud del operador de asignación : apunta a un value (valor) que es a su vez otra referencia de objeto.



Podemos apoyarnos en el esquema siguiente para afianzar nuestra idea de su estructura:



Contamos también con la función dict(nombre_secuencia), que nos habilita para crear un diccionario mediante la conversión de una secuencia de datos bajo la siguiente fórmula:



Veamos a continuación, de manera gráfica, cómo funciona el constructo dict(nombre_secuencia):





Como consecuencia de lo que sabemos hasta ahora de ellos, como secuencia mutable, se les puede añadir o eliminar elementos fácilmente, pero por su condición desordenada, no es posible señalar los elementos por un índice, lo que se conoce en Python como indexación y que ya hemos visto muchas veces en este manual (y lo que te rondaré, morena). No pueden ser indexados, como les sucede a los conjuntos, hagamos memoria, por lo que al igual que éstos, no se considera a la estructura de datos diccionario, dict, como secuencia. Y como ya seguramente habremos deducido, si no podemos indexar tampoco podemos trocearlos por rebanadas, es decir, tampoco podemos aplicar sobre ellos técnicas de slicing.



      RECORDEMOS ESTO: SI NO PODEMOS INDEXAR UNA ESTRUCTURA DE DATOS, TAMPOCO PODREMOS HACER REBANADAS CON ELLOS Y, ADEMÁS, NO SERÁ UNA SECUENCIA DE DATOS AUNQUE UNA COLECCIÓN.

Es importante destacar que tanto las key (claves) como los value (valores) pueden ser cualquier referencia a objeto aceptado por Python: listas, strings, ints, tuplas, otros diccionarios, etc.



Al margen de todo lo dicho, los diccionarios soportan la función len(), los operadores in y not in de verificación o pertenencia, sólo para las claves, y la iteración, sólo también para las claves, como podemos ver en el ejemplo siguiente no soporta, sin embargo, operadores de comparación.


Podemos a su vez emplear corchetes, [ ], para añadir o eliminar elementos en un diccionario mediante el operador de asignación =, si queremos efectuar una adición, o recurrir a la sentencia del si, por el contrario, queremos efectuar una eliminación. Veámoslo:



Notemos que siempre tendremos que actuar sobre las key (claves) para modificar un diccionario pero no a su value (valores) asociados o vinculados.
Igualmente, también es posible sustituir el valor asignado a una clave por otro utilizando el mismo procedimiento.



CUEVA PARA EL SECADO  TRADICIONAL DEL LINO EN LAS LADERAS DEL BARRANCO DE EL BATÁN, ANAGA, NORESTE DE TENERIFE.

MÉTODOS DE LOS DICCIONARIOS:


      1) DICT.CLEAR():

   
      Elimina todos los elementos de un diccionario y nos devuelve un diccionario vacío:



      2) DICT.COPY():

   
       Devuelve una copia superficial del diccionario:



      El acto de hacer una copia de un diccionario tiene su aquél, tal y como sucede con las listas. Si tenemos un diccionario, por ejemplo:
>>> d = {"Lugo": "Galicia", "Huesca":"Aragón"}
e igualamos la variable d a otra distinta, por ejemplo, x:
>>> x = d
para obtener una copia del diccionario con la nueva variable x, es decir:
                                                 >>> x = {"Lugo": "Galicia", "Huesca":"Aragón"}
podríamos pensar que tanto d como x son diccionarios distintos, con los mismos elementos, sí, pero independientes el uno del otro. A tal punto que, por ejemplo, podríamos dejar a d tal y como está y modificar x añadiendo un elemento nuevo.
Pero no es así:
                                                                              >>> x is d
                                                                              True
Si introdujéramos un nuevo ítem en x o d, éste aparecería automáticamente en el otro:


Si ésta es nuestra intención, pues vale. Pero si lo que pretendemos es dejar un diccionario tal cual, sin modificar, y manejar por contra su copia, tendremos que recurrir al método dict.copy(). Esta es la razón de ser del método: crear una copia independiente del diccionario original:


Podemos obtener el mismo resultado recurriendo a la función dict():



       3) DICT.FROMKEYS(X, Y):

   
      Devuelve un diccionario cuyas claves van a ser los elementos de una secuencia x, a los que se le asociarán como valores los elementos (o el elemento, en singular, si y refiere un único valor) de y:



En 1. observamos cómo a cada elemento de la lista s se le ha asociado como value (valor) el diccionario completo d, cualquiera que sea la longitud o tamaño de d.
En 2. aplicamos el método sobre nuestro diccionario d uniendo una lista con una tupla pues, no olvidemos, que ante una secuencia de ítems o elementos, cualquiera que fuera su tamaño, y convenientemente separados por comas, de manera predeterminada, automática, Python lo categoriza como tupla (tuple). Recordemos también que para los que nos iniciamos en esto, en orden a tener las ideas más claras y minimizar en lo posible la aparición de errores (siempre cometeremos errores. SIEMPRE. Y lo bueno de cometerlos es que luego podemos corregirlos, lo que subsecuentemente nos ayudará a conocer Python mejor), debemos recurrir al uso de paréntesis.
En 3., si sólo pasamos la lista o tupla como argumento del método, nos devolverá un diccionario con todos sus valores pasados como None.

     4) DICT.GET(K):

   
      Devuelve el valor vinculado a la key (clave) pasada como argumento del método:



En 1. hemos pasado una clave como argumento y Python nos ha devuelto su valor vinculado.
En 2. proponemos una clave inexistente a la que asociamos dentro del argumento del método, un valor. Al solicitarla nos devuelve el valor asociada a ella.
En 3. solicitamos solamente la clave inexistente en nuestro diccionario, pero no obtenemos nada. Y cuando solicitamos que Python nos muestre el diccionario, como era de esperar, no se ha producido ninguna modificación.
En 4. repetimos el caso de 2., observando cómo al solicitarle el diccionario a Python éste no ha sufrido modificación alguna.
En 5. observamos como Python conserva la integridad de la información: pedimos una clave existente y le asociamos un nuevo valor. Sin embargo, Pyhton nos devuelve el valor original vinculado a la clave demandada y no el valor nuevo por el que lo hemos sustituido. Podemos, eso sí, añadirlo como elemento nuevo dentro de nuestro diccionario con la sintaxis adecuada.



Donde en 1. efectuamos la adición de un ítem nuevo y en 2., tengamos cuidado, cambiamos un valor por otro, conservando la misma clave 'fil'. ¿Por qué? Porque los diccionarios, al igual que sus primos hermanos los conjuntos, no admiten elementos repetidos.

       5) DICT.ITEMS():

   
      Este método nos devuelve un VISOR (un VISOR en Python representa un formato específico para mostrar un resultado. Su sintaxis es dict + guión bajo + nombre del método. Abre una tupla, pues muestra el contenido entre paréntesis, alojando en su interior una lista con el contenido correspondiente. Como VISOR carece de funcionalidad por sí mismo, salvo que esté asignado a una variable. Constituye un tipo de dato y, además, es iterable) de todos los ítems del diccionario y cada ítem, recordemos, es una par key/value, clave/valor, 



      

       6) DICT.KEYS():

   
      Devuelve un VISOR con todas las key (claves) contenidas en el diccionario:



        7) DICT.POP(KEY):

   
      Este método devuelve el valor vinculado a la clave pasada como argumento y elimina el par completo del diccionario.


      8) DICT.SETDEFAULT():

     
       Este método resulta muy similar al método dict.get() con la diferencia de que si la clave (key) no se encuentra en el diccionario sobre el que aplicamos el método, se añadirá un elemento nuevo al mismo con la clave que propuesta. A esta clave (key) Python, obviamente, le asignará el valor (value) None si no se le pasa valor alguno, o el valor que pasemos como argumento.




       9) DICT.UPDATE():

      
      Con este nuevo método podemos unir dos diccionarios en uno sólo que tomaría como base el diccionario sobre el que aplicamos el método. Los pares clave/valor (key/value) del diccionario a pasarán a formar parte del diccionario. Aquéllos cuyas claves se repitan serán sustituidas por el valor de a (en nuestro ejemplo, existen dos claves "fil" cuyo valor vinculado sería el de a, así "fil":"Pitágoras" ha sido sustituido tras la aplicación del método por "fil":"Anaxágoras". que partía en origen de a).



      10) DICT.VALUES():

     
       Este método devuelve un visor con todos los valores del diccionario:



Habida cuenta de que los diccionarios contienen como ítems pares clave/valor (key/value), podemos recorrerlos tanto a través de sus ítems, cómo no, apoyándonos en el bucle o loop for/in mediante dos fórmulas sintácticas posibles.


En el primer caso se nos devuelven sendas tuplas por ítem, separados cada elemento del par clave/valor por una coma; mientras que en el segundo caso se nos devuelve un apilamiento simple.
Sin embargo, volviendo al primer caso, encontramos una opción interesante si recurrimos a los indexados que, en este caso, sí nos está permitido. Observémoslo:



Para recorrer las claves (key) de un diccionario podemos recurrir al método consabido o construir un bucle for/in directamente sobre nuestro diccionario. Aquí presentamos dos maneras:


Recordemos que para modificar los valores de un diccionario tenemos que recurrir a los corchetes. A continuación mostramos un ejemplo de intervención en este sentido:


FLORACIÓN DE LA RETAMA EN LAS CAÑADAS DEL TEIDE, CENTRO DE TENERIFE.

APUNTES SOBRE LOS VISORES DE DICCIONARIOS:


      Como recordaremos, ya hemos dado una definición de VISOR en los párrafos precedentes. Vamos a presentar otra más, complementaria, y vamos a incidir además en un par de cuestiones que le afectan:
Un VISOR de diccionario puede entenderse también como un objeto iterable que sólo permite la lectura, capaz de acoger los elementos (pares clave/valor), claves o valores de un diccionario de acuerdo a nuestra solicitud.
Un Visor es susceptible de ser tratado como un iterable que cuenta con dos cualidades interesantes: una es que cualquier modificación que hagamos en el diccionario que muestra el visor se mostrará automáticamente en el mismo; por otra parte, los visores de elementos y claves (no así los de valores) admiten operaciones similares a los conjuntos. 
Si tenemos un visor de diccionarios que llamamos a y un visor de conjunto (set) o diccionario que llamamos b, se permiten las siguientes operaciones:

CAPRICHOS ROCOSOS EN BENIJOS, ANAGA, NORESTE DE TENERIFE.


    

A & B  # INTERSECCIÓN

A | B # UNIÓN

A - B # RESTA

A ^ B # DIFERENCIA SIMÉTRICA







Admite el verificador de verificación o pertenencia in y not in, así como el operador de unión para determinar las claves comunes.



DICCIONARIOS POR COMPRENSIÓN:


      De igual manera que disponíamos de listas y conjuntos por comprensión, ¡albricias!, podemos también construir diccionarios por comprensión.
Un diccionario por comprensión está formado por una expresión y un bucle con una condición opcional (todas las condiciones, normalmente de tipo if, son opcionales en las comprensiones), entre llaves, admitiendo dos tipos de sintaxis:




Vamos a añadir una tabla resumen que nos permitirá dilucidar de un sólo vistazo las características de las secuencias de datos que hemos estudiado:



Y ahora que hemos concluido el capítulo... ¿Para qué diantres sirve un diccionario? Buena pregunta. Se pueden utilizar para llevar un control sobre las contraseñas de un usuario, o las contraseñas por usuario de un programa gestionado por nosotros o, incluso, asociado a una lista con la información completa del usuario; resultan muy útiles en procesadores de texto y todo tipo de diccionarios(¡vaya, qué casualidad!), contando el número de veces que aparece una determinada palabra o expresión en un texto; apariciones de signos y letras; palabra original y su traducción correspondiente, su definición, o su conversión, estas tres últimas pasadas como valores; etc.
Sirven, básicamente, para crear bases de datos simples, donde la clave identifica al elemento y el valor constituye los datos (o el conjunto de ellos) que determina el elemento.
Dicho esto toca ahora los ejercicios correspondientes para repasar lo aprendido:



      ME HE ENTERADO YO QUE LOS MÉTODOS DE DICCIONARIO PERMITEN EXTRAER CON FACILIDAD EL VALOR ASIGNADO A UNA CLAVE CUALQUIERA. ES EL CASO DE DICT.GET(KEY). PERO LA SITUACIÓN INVERSA NO RESULTA TAN SENCILLA: NO EXISTE NINGÚN MÉTODO ESPECÍFICO QUE PERMITA EXTRAER LA CLAVE (KEY) QUE ALMACENA UN VALOR (VALUE). ¡VAYA CHASCO! ¡ESO ES COMO MORDER UN HUESO DE MADERA! ASÍ QUE ME PUSE A PENSAR UN RATO HASTA QUE EMPEZÓ A DOLERME LA CABEZA Y CONSEGUÍ CREAR UN SCRIPT QUE ME PERMITE HACERLO SIN DEMASIADA COMPLICACIÓN. MIRAD ABAJO. ¡GUAU!👌



A partir de la versión 3.5+ (aprovechamos para recomendar encarecidamente que revisemos las actualizaciones de Python en su página oficial, python.org, para descargarnos las nuevas versiones avanzadas y estables del lenguaje) de Python podemos recurrir a un procedimiento de mergering, traducido, "combinación",  mediante el uso de operadores ** y *. En el primer caso, podemos combinar directamente y de manera sencilla dos o más diccionarios de una sola vez, lo que equivale al uso del método dict1.update(dict2), mientras que en el segundo podemos extraer las claves (keys) de nuestro/s diccionario/s de manera sencilla y que se mostrarán agrupadas en un conjunto (tipo de dato set), lo cual resulta, sencillamente, GLORIOSO 👏. Como es propio y característico de los diccionarios, se eliminan las claves repetidas y sólo se almacena la clave repetida con su valor correspondiente que aparezca en último lugar.




T4. BLOQUE DE EJERCICIOS 6. SOLUCIONES.


TAJINASTES ROJOS EN FLOR, CODESOS EN FLOR Y LAVÁNDULAS EN LAS CAÑADAS DEL TEIDE, CENTRO DE TENERIFE.



No hay comentarios:

Publicar un comentario