Estructuras de Datos en Python

Las Estructuras de Datos en Python proporcionan una base fundamental para almacenar y manipular datos de manera eficiente. Cada tipo de estructura tiene características únicas, optimizadas para diferentes casos de uso. Python ofrece múltiples estructuras de datos como listas, tuplas, diccionarios y conjuntos. A continuación, detallo cada una de estas estructuras en profundidad.
1. Listas y Tuplas
Empecemos hablando de las Listas
Las listas en Python son estructuras de datos ordenadas, mutables y dinámicas que permiten almacenar elementos de cualquier tipo. Se representan mediante corchetes [], y sus elementos se pueden modificar una vez creados. Las listas se introdujeron en la primera versión de Python y han sido una parte esencial del lenguaje debido a su flexibilidad
Características principales:
- Mutable: Sus elementos se pueden cambiar después de su creación.
- Ordenada: Mantiene el orden de inserción.
- Permite duplicados: Puede contener elementos repetidos
Ejemplo creación de listas:
# Lista vacía
mi_lista = []
# Lista con elementos de diferentes tipos
mi_lista = [1, "Python", 3.14, True]
Indexación y Slicing
Las listas admiten indexación (acceder a elementos mediante su posición) y slicing (obtener sublistas).
mi_lista = [10, 20, 30, 40, 50]
# Acceder al primer elemento
print(mi_lista[0]) # Salida: 10
# Obtener los últimos dos elementos
print(mi_lista[-2:]) # Salida: [40, 50]
Modificación de Elementos
Las listas se pueden modificar reemplazando elementos en posiciones específicas.
mi_lista = [1, 2, 3]
mi_lista[1] = 10
print(mi_lista) # Salida: [1, 10, 3]
Métodos Comunes de las Listas
- append(x): Agrega x al final de la lista.
- extend(iterable): Extiende la lista con los elementos de un iterable.
- insert(i, x): Inserta x en la posición i.
- remove(x): Elimina la primera aparición de x.
- pop(i): Elimina el elemento en la posición i y lo retorna.
- sort(): Ordena la lista en orden ascendente (modifica la lista).
mi_lista = [3, 1, 2]
mi_lista.append(4) # Agrega 4 al final
mi_lista.sort() # Ordena la lista
print(mi_lista) # Salida: [1, 2, 3, 4]
Y… ¿Las Tuplas?
Las tuplas son similares a las listas, pero son inmutables (no se pueden modificar después de su creación). Las tuplas se representan mediante paréntesis (). Al ser inmutables, son útiles para almacenar datos constantes y mejorar el rendimiento en ciertas operaciones.
Características principales:
- Inmutable: Una vez creada, no se puede modificar.
- Ordenada: Mantiene el orden de inserción.
- Permite duplicados: Puede contener elementos repetidos.
Ejemplo de creación:
# Tupla vacía
mi_tupla = ()
# Tupla con elementos
mi_tupla = (1, "Python", 3.14)
Indexación y Slicing
Al igual que las listas, las tuplas admiten indexación y slicing.
mi_tupla = (10, 20, 30)
# Acceder al primer elemento
print(mi_tupla[0]) # Salida: 10
# Obtener una sub-tupla
print(mi_tupla[1:]) # Salida: (20, 30)
Operaciones Comunes de las Tuplas
Dado que las tuplas son inmutables, no poseen métodos para modificar sus elementos. Sin embargo, ofrecen métodos útiles como count() y index().
mi_tupla = (1, 2, 3, 2)
# Contar cuántas veces aparece el número 2
print(mi_tupla.count(2)) # Salida: 2
# Encontrar la posición del número 3
print(mi_tupla.index(3)) # Salida: 2
2. Diccionarios
Los diccionarios son estructuras de datos que almacenan pares de clave-valor, donde cada clave es única y apunta a un valor. Se introdujeron en Python 1.0, y a partir de Python 3.7, mantienen el orden de inserción. Son extremadamente útiles para organizar datos y acceder rápidamente a valores mediante una clave.
Características principales:
- Mutable: Los valores pueden modificarse después de su creación.
- No ordenado (en versiones < 3.7): No garantiza el orden de inserción antes de Python 3.7.
- Claves únicas: Cada clave debe ser única, pero los valores pueden repetirse.
Ejemplo de creación de un Diccionario:
# Diccionario vacío
mi_diccionario = {}
# Diccionario con datos
mi_diccionario = {"nombre": "Python", "version": 3.9}
Acceso a Elementos
# Acceder al valor de la clave 'nombre'
print(mi_diccionario["nombre"]) # Salida: Python
Modificación de Elementos
mi_diccionario["version"] = 3.10
print(mi_diccionario) # Salida: {'nombre': 'Python', 'version': 3.10}
Métodos Comunes de los Diccionarios
- get(clave, valor_defecto): Devuelve el valor de la clave, o el valor por defecto si la clave no existe.
- keys(): Devuelve una vista de las claves.
- values(): Devuelve una vista de los valores.
- items(): Devuelve una vista de los pares clave-valor.
- pop(clave): Elimina y devuelve el valor de la clave.
- update(otro_diccionario): Actualiza el diccionario con pares clave-valor de otro diccionario.
mi_diccionario = {"a": 1, "b": 2}
# Obtener el valor asociado a la clave 'a'
print(mi_diccionario.get("a")) # Salida: 1
# Obtener todas las claves
print(mi_diccionario.keys()) # Salida: dict_keys(['a', 'b'])
3. Conjuntos (Sets)
Los conjuntos son colecciones no ordenadas de elementos únicos, introducidos en Python 2.4. Son especialmente útiles para realizar operaciones de conjuntos matemáticos, como unión, intersección y diferencia.
Características principales:
- No ordenado: Los elementos no tienen un orden específico.
- Inmutable (en el caso de conjuntos tipo frozenset).
- Sin duplicados: Cada elemento es único.
Creación de Conjuntos
# Conjunto vacío
mi_conjunto = set()
# Conjunto con elementos
mi_conjunto = {1, 2, 3}
Operaciones de Conjuntos
- Union (|): Retorna un conjunto con todos los elementos de ambos conjuntos.
- Intersección (&): Retorna un conjunto con los elementos comunes entre dos conjuntos.
- Diferencia (-): Retorna los elementos presentes en un conjunto y no en otro.
- Diferencia simétrica (^): Retorna elementos únicos entre dos conjuntos.
a = {1, 2, 3}
b = {3, 4, 5}
# Unión
print(a | b) # Salida: {1, 2, 3, 4, 5}
# Intersección
print(a & b) # Salida: {3}
# Diferencia
print(a - b) # Salida: {1, 2}
# Diferencia simétrica
print(a ^ b) # Salida: {1, 2, 4, 5}
Métodos Comunes de los Conjuntos
- add(x): Agrega un elemento x al conjunto.
- remove(x): Elimina el elemento x del conjunto.
- discard(x): Elimina el elemento x sin generar error si no está presente.
- clear(): Vacía el conjunto.
mi_conjunto = {1, 2, 3}
mi_conjunto.add(4) # Agrega 4 al conjunto
mi_conjunto.discard(2) # Elimina 2 del conjunto sin error
print(mi_conjunto) # Salida: {1, 3, 4}
Aplicaciones Prácticas y Usos Comunes
Listas: Muy útiles para coleccionar y ordenar elementos en aplicaciones que requieren mutabilidad, como listas de tareas, nombres de archivos, o colecciones de datos.
Tuplas: Se usan para representar datos constantes, como coordenadas, fechas, y otros valores inmutables en bases de datos.
Diccionarios: Útiles para mapas de datos como configuraciones, catálogos de productos o registros donde las claves son identificadores únicos.
Conjuntos: Aplicables en la eliminación de duplicados en listas, la verificación de membresías o comparaciones entre conjuntos de datos.