5.3.5 Diccionarios por comprensión

5.3.5 Diccionarios por comprensión

Nivel intermedio

De forma análoga a cómo se escriben las listas por comprensión, podemos aplicar este método a los diccionarios usando llaves { }.

Veamos un ejemplo en el que creamos un diccionario por comprensión donde las claves son palabras y los valores son sus longitudes:

5.3.5 Diccionarios por comprensión

También podemos aplicar condiciones a estas comprensiones. Continuando con el ejemplo anterior, podemos incorporar la restricción de sólo incluir palabras que no empiecen por vocal:

5.3.5 Diccionarios por comprensión

Nota: Se puede consultar el PEP-274 para ver más ejemplos sobre diccionarios por comprensión.

Ejercicio

Tenemos almacenadas las notas de un examen en un diccionario. Es necesario separar al alumnado que aprobó y al que suspendió en dos diccionarios. Igualmente habrá que pasar a mayúsculas el nombre del alumnado que aprobó y a minúsculas el nombre del alumnado que suspendió. Escriba un programa en Python que realice esta operación usando diccionarios por comprensión.

Ejemplo

  • Entrada: {‘John’: 4, ’Marc’: 7, ’Meryl’: 2, ‘Anthony’: 8, ’Carol’: 3, ‘Andreas’: 3, ’Sarah’: 6}
  • Salida:

5.3.5 Diccionarios por comprensión

5.3.6 Objetos «hashables»

Nivel avanzado

La única restricción que deben cumplir las claves de un diccionario es ser «hashables»[1]. Un objeto es «hashable» si se le puede asignar un valor «hash» que no cambia en ejecución durante toda su vida.

Para encontrar el «hash» de un objeto, Python usa la función hash(), que devuelve un número entero y es utilizado para indexar la tabla «hash» que se mantiene internamente:

5.3.5 Diccionarios por comprensión

Para que un objeto sea «hashable», debe ser inmutable:

5.3.5 Diccionarios por comprensión

Nota: De lo anterior se deduce que las claves de los diccionarios, al tener que ser «hasheables», sólo pueden ser objetos inmutables.

La función «built-in» hash() realmente hace una llamada al método mágico________ hash__ () del objeto en cuestión:

5.3.5 Diccionarios por comprensión

EJERCICIOS DE REPASO

  1. Escriba un programa en Python que acepte una lista de palabras y las agrupe por su l
  • Entrada: [ ‘mesa’, ‘móvil’, ‘barco’, ‘coche’, ‘avión’, ‘bandeja’, ‘casa’, ‘monitor’, ‘carretera’, ‘arco’]
  • Salida: {‘m’: [‘mesa’, ‘móvil’, ‘monitor’], ’b’: [‘barco’, ‘bandeja’], ’c’: [‘coche’, ‘casa’, ‘carretera’], ’a’: [‘avión’, ‘arco’]}
  1. Escriba un programa en Python que acepte un diccionario y determine si todos los val
  • Entrada: {‘Juan’: 5, ‘Antonio’: 5, ’Inma’: 5, ‘Ana’: 5, ‘Esteban’: 5}
  • Salida: Same values
  1. Escriba un programa en Python que acepte una lista de listas con varios elementos y c
  • Entrada: [[‘Episode IV – A New Hope’, ‘May 25’, 1977], [’Episode V – The Empire Strikes Back’, ‘May 21’, 1980], [’Episode VI – Return of the Jedi’, ‘May 25’, 1983]]
  • Salida: {’Episode IV – A New Hope’: [‘May 25’, 1977], ’Episode V – The Empire Strikes Back’: [‘May 21’, 1980], ’Episode VI – Return of the Jedi’: [‘May 25’, 1983]}
  1. Escriba un programa en Python que acepte un diccionario cuyos valores son listas y b<
  • Entrada: {‘C1’: [10, 20, 30], ‘C2′: [20, 30, 40], *03’: [12, 34]}
  • Salida: {‘C1′: [], ’C2’: [], ‘C3’: []}
  1. Escriba un programa en Python que acepte un diccionario y elimine los espacios de su
  • Entrada: {’S 001’:  [’Math’, ‘Science’], ’S 002’: [’Math’,’English’]}
  • Salida: {‘S001’: [’Math’, ‘Science’], ‘S002’: [’Math’, ’English’]}

AMPLIAR CONOCIMIENTOS

  • Using the Python defaultdict Type for Handling Missing Keys
  • Python Dictionary Iteration: Advanced Tips & Tricks
  • Python KeyError Exceptions and How to Handle Them
  • Dictionaries in Python
  • How to Iterate Through a Dictionary in Python
  • Shallow vs Deep Copying of Python Objects
5.4 Conjuntos

5.3.5 Diccionarios por comprensión

Un conjunto en Python representa una serie de valores únicos y sin orden establecido, con la única restricción de que sus elementos deben ser «hashables». Mantiene muchas similitudes con el concepto matemático de conjunto

5.4.1 Creando conjuntos

Para crear un conjunto basta con separar sus valores por comas y rodearlos de llaves {}: >>> lottery = {21, 10, 46, 29, 31, 94}

5.3.5 Diccionarios por comprensión

La excepción la tenemos a la hora de crear un conjunto vacío, ya que, siguiendo la lógica de apartados anteriores, deberíamos hacerlo a través de llaves:

5.3.5 Diccionarios por comprensión

La única opción que tenemos es utilizar la función set():

5.3.5 Diccionarios por comprensión

5.4.2 Conversión

Para convertir otros tipos de datos en un conjunto podemos usar la función set() sobre cualquier iterable:

5.3.5 Diccionarios por comprensión

5.3.5 Diccionarios por comprensión

Importante: Como se ha visto en los ejemplos anteriores, set() se suele utilizar en muchas ocasiones como una forma de extraer los valores únicos de otros tipos de datos. En el caso de los diccionarios se extraen las claves, que, por definición, son únicas.
Nota:    El hecho de que en los ejemplos anteriores los elementos de los conjuntos estén ordenados es únicamente un «detalle de implementación» en el que no se puede confiar.
5.4.3 Operaciones con conjuntos

Obtener un elemento

En un conjunto no existe un orden establecido para sus elementos, por lo tanto no podemos acceder a un elemento en concreto.

De este hecho se deriva igualmente que no podemos modificar un elemento existente, ya que ni siquiera tenemos acceso al mismo. Python sí nos permite añadir o borrar elementos de un conjunto.

Añadir un elemento

Para añadir un elemento a un conjunto debemos utilizar la función add(). Como ya hemos indicado, al no importar el orden dentro del conjunto, la inserción no establece a priori la posición donde se realizará.

A modo de ejemplo, vamos a partir de un conjunto que representa a los cuatro integrantes originales de The Beatles. Luego añadiremos a un nuevo componente:

5.3.5 Diccionarios por comprensión

5.3.5 Diccionarios por comprensión

Ejecución paso a paso a través de Python Tutor:

https://tinyurl.com/9folv2v

Ejercicio

Dada una tupla de duplas (2 valores), cree dos conjuntos:

  • Uno de ellos con los primeros valores de cada dupla.
  • El otro con los segundos valores de cada dupla.

Ejemplo

  • Entrada: ((4, 3), (8, 2), (7, 5), (8, 2), (9, 1))
  • Salida:

5.3.5 Diccionarios por comprensión

Borrar elementos

Para borrar un elemento de un conjunto podemos utilizar la función remove(). Siguiendo con el ejemplo anterior, vamos a borrar al último «beatle» añadido:

5.3.5 Diccionarios por comprensión

Longitud de un conjunto

Podemos conocer el número de elementos que tiene un conjunto con la función len():

5.3.5 Diccionarios por comprensión

Iterar sobre un conjunto

Tal y como hemos visto para otros tipos de datos iterables, la forma de recorrer los elementos de un conjunto es utilizar la sentencia for:

5.3.5 Diccionarios por comprensión

Consejo: Como en el ejemplo anterior, es muy común utilizar una variable en singular para recorrer un iterable (en plural). No es una regla fija ni sirve para todos los casos, pero sí suele ser una buena práctica.

Pertenencia de elemento

Al igual que con otros tipos de datos, Python nos ofrece el operador in para determinar si un elemento pertenece a un conjunto:

5.4.4 Teoría de conjuntos

Vamos a partir de dos conjuntos A = {1,2} y B = {2, 3} para ejemplificar las distintas operaciones que se pueden hacer entre ellos basadas en los Diagramas de Venn y la Teoría de Conjuntos:

5.3.5 Diccionarios por comprensión

Figura 7: Diagramas de Venn

Intersección

A n B – Elementos que están a la vez en A y en B:

5.3.5 Diccionarios por comprensión

Unión

A U B – Elementos que están tanto en A como en B:

5.3.5 Diccionarios por comprensión

Diferencia

A — B – Elementos que están en A y no están en B:

5.3.5 Diccionarios por comprensión

Diferencia simétrica

A fl B – Elementos que están en A o en B pero no en ambos conjuntos:

5.3.5 Diccionarios por comprensión

5.4 Conjuntos por comprensión

Los conjuntos, al igual que las listas y los diccionarios, también se pueden crear por comprensión.

Veamos un ejemplo en el que construimos un conjunto por comprensión con los aquellos números enteros múltiplos de 3 en el rango [0, 20):

5.3.5 Diccionarios por comprensión

Ejercicio

Dadas dos cadenas de texto, obtenga una nueva cadena de texto con las letras consonantes que se repiten en ambas frases. Ignore los espacios en blanco y muestre la cadena de salida con sus letras ordenadas.

Resuelva el ejercicio mediante dos aproximaciones: Una de ellas usando conjuntos por comprensión y otra sin usar comprensiones.

Ejemplo

  • Entrada: Flat is better than nested y Readability counts
  • Salida: bdlnst
5.4.6 Conjuntos inmutables

Python ofrece la posibilidad de crear conjuntos inmutables haciendo uso de la función frozenset() que recibe cualquier iterable como argumento.

Supongamos que recibimos una serie de calificaciones de exámenes y queremos crear un conjunto inmutable con los posibles niveles (categorías) de calificaciones:

5.3.5 Diccionarios por comprensión

Veamos qué ocurre si intentamos modificar este conjunto:

5.3.5 Diccionarios por comprensión

Nota: Los frozenset son a los sets lo que las tuplas a las listas: una forma de «congelar» los valores para que no se puedan modificar.

AMPLIAR CONOCIMIENTOS

Publicaciones Similares