Estructuras de Datos en Python


Estructuras de Datos en Python

Python ofrece diversas estructuras de datos que facilitan el manejo de información en nuestros programas. Este artículo explora los tipos básicos, estructuras avanzadas y buenas prácticas para manipularlos.

Tipos Básicos

Python incluye varios tipos de datos fundamentales:

  • int: Números enteros (1, -10, 42)
  • float: Números decimales (3.14, -0.5, 2.0)
  • bool: Valores booleanos (True, False)
  • str: Cadenas de texto ("Hola", 'Python')
  • NoneType: Representado por el valor None (equivalente a null en otros lenguajes)

Colecciones

Las estructuras de colección permiten agrupar múltiples valores:

  • list: Secuencias ordenadas y mutables ([1, 2, 3])
  • tuple: Secuencias ordenadas e inmutables ((1, 2, 3))
  • dict: Pares clave-valor ({"nombre": "Ana", "edad": 25})
  • set: Conjuntos no ordenados de elementos únicos ({1, 2, 3})

Estilo de Código en Python

Python promueve un estilo de escritura claro y consistente:

  • snake_case para variables y funciones
  • PascalCase (primera letra mayúscula) para clases
  • Indentación con espacios (4 espacios es lo estándar)
  • Uso semántico adecuado de estructuras

Este estilo está codificado en el PEP 8, la guía oficial de estilo para Python.

Variables

Una variable es un espacio para almacenar datos modificables en la memoria del ordenador. En Python, se definen con la sintaxis:

nombre_de_la_variable = valor_de_la_variable

Python utiliza tipado dinámico, lo que significa que no es necesario declarar el tipo de variable explícitamente. El tipo se infiere en tiempo de ejecución y puede cambiar.

Métodos de Manipulación de Variables

En Python, toda variable se considera un objeto. Los objetos tienen métodos (funciones asociadas) que permiten realizar operaciones sobre ellos:

variable.metodo()  # Sin parámetros
variable.metodo(parametro)  # Con parámetros

Operaciones entre Tipos

Python permite diversas operaciones entre tipos de datos:

Operadores Aritméticos

  • + : Suma (también concatenación para strings y listas)
  • * : Multiplicación (también repetición para strings y listas)
  • - : Resta
  • / : División (resultado float)
  • // : División entera (resultado int)
  • % : Módulo (resto de división)
  • ** : Potencia

Ejemplos de Operaciones entre Tipos

# Operaciones con booleanos
True + True  # 2 (True se convierte a 1)
True * False  # 0 (False se convierte a 0)

# Operaciones con enteros
5 + 3  # 8
5 * 3  # 15

# Operaciones con strings
"Hola" + " mundo"  # "Hola mundo"
"Hola" * 3  # "HolaHolaHola"

# Operaciones mixtas
"Repetir " * 3  # "Repetir Repetir Repetir "
"Edad: " + str(25)  # "Edad: 25" (requiere conversión explícita)

Manipulación de Strings

Los strings tienen numerosos métodos útiles:

texto = "python es genial"

texto.capitalize()  # "Python es genial"
texto.upper()  # "PYTHON ES GENIAL"
texto.lower()  # "python es genial"
texto.swapcase()  # "PYTHON ES GENIAL"
texto.center(20)  # "  python es genial  "
texto.count("n")  # 2
texto.find("es")  # 7
texto.startswith("py")  # True
texto.endswith("ial")  # True

Manipulación de Listas

Las listas son colecciones ordenadas y mutables:

colores = ["rojo", "verde", "azul"]

# Añadir elementos
colores.append("amarillo")  # ["rojo", "verde", "azul", "amarillo"]
colores.insert(1, "naranja")  # ["rojo", "naranja", "verde", "azul", "amarillo"]

# Eliminar elementos
colores.remove("verde")  # ["rojo", "naranja", "azul", "amarillo"]
eliminado = colores.pop(1)  # eliminado = "naranja", colores = ["rojo", "azul", "amarillo"]

# Ordenar
colores.sort()  # ["amarillo", "azul", "rojo"]
colores.reverse()  # ["rojo", "azul", "amarillo"]

Trabajando con Diccionarios

Los diccionarios almacenan pares clave-valor:

persona = {"nombre": "Carlos", "edad": 30, "ciudad": "Santiago"}

# Acceder a valores
nombre = persona["nombre"]  # Carlos
edad = persona.get("edad")  # 30 (método más seguro)

# Añadir/modificar valores
persona["profesion"] = "Ingeniero"
persona["edad"] = 31

# Eliminar valores
del persona["ciudad"]
profesion = persona.pop("profesion")  # Elimina y devuelve el valor

# Iterar sobre un diccionario
for clave in persona:
    print(f"{clave}: {persona[clave]}")

for clave, valor in persona.items():
    print(f"{clave}: {valor}")

Definición de Funciones

Las funciones permiten encapsular código reutilizable:

def saludar(nombre):
    return f"Hola, {nombre}!"

def calcular_area_rectangulo(base, altura):
    return base * altura

# Función con valor por defecto
def saludar_formal(nombre, titulo="Sr./Sra."):
    return f"Saludos, {titulo} {nombre}"

# Función que pide input al usuario
def obtener_nombre():
    return input("Introduce tu nombre: ")

Iteración

Python ofrece varias formas de iterar sobre colecciones:

# Iterar sobre una lista
frutas = ["manzana", "banana", "cereza"]
for fruta in frutas:
    print(fruta)

# Iterar con índices
for indice, fruta en enumerate(frutas):
    print(f"Índice {indice}: {fruta}")

# Iterar sobre un diccionario
persona = {"nombre": "Ana", "edad": 25}
for clave, valor en persona.items():
    print(f"{clave}: {valor}")

Clases y Objetos

Python es un lenguaje orientado a objetos que permite crear clases personalizadas:

class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad
        
    def saludar(self):
        return f"Hola, me llamo {self.nombre} y tengo {self.edad} años"

# Crear un objeto
ana = Persona("Ana", 25)
print(ana.saludar())

Dataclasses (Python 3.7+)

Las dataclasses simplifican la creación de clases centradas en datos:

from dataclasses import dataclass

@dataclass
class Punto:
    x: float
    y: float
    
    def distancia_al_origen(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5

punto = Punto(3.0, 4.0)
print(punto.distancia_al_origen())  # 5.0

Proyecto Práctico: Reemplazo de Emojis

Como ejercicio práctico, podemos crear un programa que reemplace emojis textuales por sus equivalentes en una conversación:

def reemplazar_emojis(texto, diccionario_emojis):
    for emoji_texto, emoji_real en diccionario_emojis.items():
        texto = texto.replace(emoji_texto, emoji_real)
    return texto

# Diccionario de emojis
emojis = {
    ":)": "😊",
    ":(": "😢",
    ":D": "😃",
    ";)": "😉",
    ":P": "😛"
}

# Conversación de ejemplo
conversacion = [
    "Hola! Cómo estás? :)",
    "Muy bien! :D Y tú?",
    "Un poco cansado :( pero bien ;)",
    "Te entiendo :P"
]

# Procesar la conversación
conversacion_procesada = [reemplazar_emojis(linea, emojis) for linea en conversacion]

# Mostrar resultado
for linea en conversacion_procesada:
    print(linea)

Recursos Adicionales