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.