La colección de tipo set no mantiene un orden entre sus elementos, como lo hacían las tuplas o las listas; tampoco permite repetir elementos. Dentro de un set no es posible modificar los elementos ya almacenados, no obstante, si es posible agregar más elementos o eliminarlos. La idea detrás de un set es la de conjunto en matemáticas (de ahí que no se permitan elementos duplicados).
Podemos definir un set como sigue
import numpy as np
# Utilizaremos llaves para definir nuestro set
primer_set = {'Luis', 1, np.pi}
# veamos nuestro set
print(primer_set)
{1, 3.141592653589793, 'Luis'}
donde no necesariamente se muestran los elementos en el orden en el que definimos el set. Podemos rescatar las siguientes funcionalidades en los set
# número de elementos
print(len(primer_set))
print("-" * 30)
# Podemos ver si un elemento está en nuestro set
print(1 in primer_set)
print('Pedro' in primer_set)
print("-" * 30)
# Podemos agregar un nuevo elemento a nuestro set
primer_set.add(2)
print(primer_set)
3 ------------------------------ True False ------------------------------ {1, 2, 3.141592653589793, 'Luis'}
Podemos comprobar que los sets no permiten elementos duplicados, por ejemplo agregemos 1
nuevamente a nuestro set primer_set
:
primer_set.add(1)
print(primer_set)
{1, 2, 3.141592653589793, 'Luis'}
donde sólo se muestra un 1
a pesar de tener uno ya almacenado y querer agregar otro. Continuemos viendo más propiedades
# Removamos un elemento de nuestro set
primer_set.remove(2)
print(primer_set)
print("-" * 30)
# o de manera alternativa
primer_set.discard(1)
print(primer_set)
{1, 3.141592653589793, 'Luis'} ------------------------------ {3.141592653589793, 'Luis'}
donde remove()
nos puede arrojar un posible error si el elemento que queremos eliminar no se encuentra en nuestro set y donde discard()
no arroja ningún error en este caso.
Finalmente
# Podemos eliminar todos los elementos de nuestro set
primer_set.clear()
print(primer_set)
set()
La idea detrás de los diccionarios que conocemos habitualmente puede trasladarse al mundo de la programación. Recordemos que en un diccionario tenemos la palabra clave seguido de la definición correspondiente
En python tendremos la misma idea de diccionario, donde a la palabra clave la denominaremos llave (key) y a la definición correspondiente lo conoceremos como valor (value). De tal manera los elementos dentro de los diccionarios estarán conformados de key:value. En el Proyecto1 parte 2 trabajamos brevemente con los diccionarios.
Por ejemplo, podemos crear un diccionario con la siguiente información:
en código tenemos
# 1. para definir un diccionario utilizamos llaves {}
# 2. seguido de la key debemos colocar dos puntos (:) para definir los valores de dicha llave
diccionario1 = {'Lunes': 'estudiar programación en python', 'Martes': 'practicar ajedrez',
'Miércoles': 'descanso', 'Jueves': 'practicar fútbol'}
# veamos nuestro primer diccionario
print(diccionario1)
{'Lunes': 'estudiar programación en python', 'Martes': 'practicar ajedrez', 'Miércoles': 'descanso', 'Jueves': 'practicar fútbol'}
# podemos conocer el número de elementos en nuestro diccionario
print(len(diccionario1))
4
Cabe resaltar que los elementos dentro de un diccionario son de la forma key:value por lo que en nuestro caso el diccionario diccionario1
tiene 4 elementos. Si queremos acceder a un elemento debemos hacerlo mediante la llave, por ejemplo
# accedemos al valor de la llave 'Lunes' (forma 1)
print(diccionario1['Lunes'])
print("-" * 30)
# accedemos al valor de la llave 'Martes' (forma 2)
print(diccionario1.get('Martes'))
estudiar programación en python ------------------------------ practicar ajedrez
# podemos modificar los valores de las llaves
# modifiquemos el valor de la llave 'Miércoles'
diccionario1['Miércoles'] = 'Jugar fifa'
# veamos la modificación
print(diccionario1)
{'Lunes': 'estudiar programación en python', 'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol'}
# de manera análoga podemos agregar más elementos a nuestro diccionario
# agregemos la llave 'Viernes' con el valor 'Ir a correr al parque':
diccionario1['Viernes'] = 'Ir a correr al parque'
print(diccionario1)
print("-" * 90)
# podemos romover un elemento utilizando pop()
diccionario1.pop('Lunes')
print(diccionario1)
{'Lunes': 'estudiar programación en python', 'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol', 'Viernes': 'Ir a correr al parque'} ------------------------------------------------------------------------------------------ {'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol', 'Viernes': 'Ir a correr al parque'}
Por otra parte, podemos recorrer todos los elementos de un diccionario utilizando un bucle for
for elemento in diccionario1:
print(elemento)
Martes Miércoles Jueves Viernes
sin embargo puede notarse cómo sólo nos arroja las llaves del diccionario, y como bien sabemos un elemento dentro de un diccionario está compuesto por una llave y por un valor. Para acceder a un elemento de manera completa utilizaremos diccionario1.items()
lo que nos permitirá acceder a los elementos del diccionario de forma completa, es decir
# hacemos las correcciones necesarias
for llave, valor in diccionario1.items():
print(llave, valor)
Martes practicar ajedrez Miércoles Jugar fifa Jueves practicar fútbol Viernes Ir a correr al parque
Aunque la primera forma de recorrer los elementos de un diccionario utilizando un bucle for
nos arroja como resultado las llaves de los elementos, existe un forma concreta de obtener dichas llaves. Así como utilizamos diccionario1.items()
para acceder a los elementos completos, tenemos diccionario1.keys()
para acceder únicamente a las llaves o diccionario1.values()
para acceder a los valores de las llaves
# accedemos a las llaves del diccionario
for llave in diccionario1.keys():
print(llave)
print("-" * 30)
# accedemos a los valores de las llaves del diccionario
for valor in diccionario1.values():
print(valor)
Martes Miércoles Jueves Viernes ------------------------------ practicar ajedrez Jugar fifa practicar fútbol Ir a correr al parque
Observaciones:
Los diccionarios son mutables pero las llaves no. Por ejemplo, una lista no puede fungir como llave pues ésta es mutable.
Las llaves son únicas. Si agregamos una llave repetida a un diccionario simplemente se sobreescribirá el valor correspondiente a esa llave.
Los valores de las llaves pueden ser cualquier tipo de datos: cadenas, listas, números, etcétera. En el Proyecto1 parte 2 trabajamos con valores en forma de listas de comprensión.
La diferencia entre diccionario1['Lunes']
que empleamos para acceder al valor de la llave 'Lunes' y diccionario1.get('Lunes')
para la misma tarea, es que la primera nos arrojará una excepción si no encuentra la llave que le indicamos y la segunda no. De hecho, utilizar get()
nos permite buscar, si existe, la llave en cuestión y como segundo parámetro podemos agregar un mensaje en caso de que dicha llave no exista (cabe resaltar que en todo momento el diccionario no será modificado), por ejemplo
# la primera manera nos arrojará una excepción
print(diccionario1['Sábado'])
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-14-2204b344c489> in <module> 1 # la primera manera nos arrojará una excepción 2 ----> 3 print(diccionario1['Sábado']) KeyError: 'Sábado'
# la segunda nos arrojará un mensaje previamente establecido
print(diccionario1.get('Sábado', 'Día no contabilizado'))
Día no contabilizado
Si no colocamos el mensaje por defecto se mostrará none
cuando no se encuentre la llave que buscamos.
El último punto de la observación anterior sirve como preámbulo para ver el siguiente tema:
Ésta nos permitirá modificar el diccionario además de agregar valores por defecto. Por ejemplo, deseamos acceder a la llave 'Lunes'
si es el caso que exista dentro de nuestro diccionario, caso contario deseamos que sea agregado al mismo con el valor 'Descanso'
# primero observemos nuestro diccionario
print(diccionario1)
{'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol', 'Viernes': 'Ir a correr al parque'}
# luego aplicamos el setdefault()
diccionario1.setdefault('Lunes', 'Descanso')
# veamos ahora nuestro diccionario
print(diccionario1)
{'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol', 'Viernes': 'Ir a correr al parque', 'Lunes': 'Descanso'}
como no se encontró la llave 'Lunes'
dentro del diccionario se agregó con el valor que asignamos. Si por ejemplo utilizamos diccionario1.setdefault('Martes', 'Descanso')
nuestro diccionario no se verá modificado pues la llave 'Martes'
se encuentra ya dentro del diccionario.
# aplicamos el setdefault()
diccionario1.setdefault('Martes', 'Descanso')
# veamos ahora nuestro diccionario
print(diccionario1)
{'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Jueves': 'practicar fútbol', 'Viernes': 'Ir a correr al parque', 'Lunes': 'Descanso'}
# podemos tambier acceder a los valores de las llaves dentro del diccionario
print(diccionario1.setdefault('Lunes', 'Valor por default'))
Descanso
En resumen get()
nos permite acceder a una llave si es que existe y caso contrario puede mostrar un mensaje, sin embargo en todo momento el diccionario no fue modificado. En cambio, utilizando setdefault()
podemos acceder a los valores de la llaves en el caso que existan éstas y caso contrario las agregaremos al diccionario con el valor indicado
# en este caso la llave no exite dentro del diccionario, pero con setdefault
# lo hemos agregado con el valor 'valor por defecto'
print(diccionario1.setdefault('Domingo', 'Valor por defecto'))
Valor por defecto
Existe un módulo que nos permite visualizar mejor la impresión de los diccionarios (en general de estructura de datos), dicho módulo es pprint()
. Por ejemplo
# Realizamos la importación necesaria
from pprint import pprint as pp
# imprimimos nuestro diccionario
pp(diccionario1)
{'Domingo': 'Valor por defecto', 'Jueves': 'practicar fútbol', 'Lunes': 'Descanso', 'Martes': 'practicar ajedrez', 'Miércoles': 'Jugar fifa', 'Viernes': 'Ir a correr al parque'}
la cual es una manera más amigable de visualizar el diccionario. Puede notarse que al realizarse la impresión de esta manera se ha colocado un orden ascendente, que en este caso es el orden alfabético pues estamos trabajando con cadenas de texto.