Curso de Python · Bloque 03 de 09

Estructuras de datos

Listas, tuplas, diccionarios, conjuntos, copias y collections.

75–105 min Descargar notebook ↓

Audiencia. Personas que ya han visto algo de programación y quieren repasar Python de forma práctica.
Prerrequisitos. Variables, bucles y condicionales.
Duración orientativa. 60–90 minutos, incluida la práctica.

Objetivos de aprendizaje

  • Elegir entre listas, tuplas, diccionarios y conjuntos.
  • Consultar, actualizar, recorrer y comprender estructuras.
  • Usar desempaquetado, comprensiones y utilidades de collections.
  • Distinguir alias, copia superficial y copia profunda.

Itinerario

  1. Listas
  2. Tuplas
  3. Diccionarios
  4. Conjuntos
  5. Comprensiones
  6. Copias
  7. collections
  8. Práctica

Cómo trabajar: ejecuta las celdas en orden, predice el resultado antes de verlo y modifica los ejemplos. Cada bloque termina con un ejercicio, un punto de partida y una solución posible.

1. Listas: secuencias mutables

Una lista mantiene orden, acepta duplicados y se puede modificar. Los índices y slices funcionan como en las cadenas.

Python
lenguajes = ["Python", "JavaScript", "Rust"]
lenguajes.append("Go")
lenguajes.insert(1, "SQL")
ultimo = lenguajes.pop()

print(lenguajes)
print("Primero:", lenguajes[0], "Último extraído:", ultimo)
print("Fragmento:", lenguajes[1:3])
Resultado
['Python', 'SQL', 'JavaScript', 'Rust']
Primero: Python Último extraído: Go
Fragmento: ['SQL', 'JavaScript']

sort() modifica la lista y devuelve None; sorted() produce una lista nueva desde cualquier iterable. La función key define el criterio sin alterar los elementos.

Python
palabras = ["sol", "universo", "luz", "planeta"]
por_longitud = sorted(palabras, key=len)
print("Original:", palabras)
print("Ordenada:", por_longitud)
Resultado
Original: ['sol', 'universo', 'luz', 'planeta']
Ordenada: ['sol', 'luz', 'planeta', 'universo']

2. Tuplas: registros inmutables

Una tupla mantiene orden pero no se puede modificar. Es útil para coordenadas, valores de retorno múltiples y claves compuestas de diccionario.

Python
punto = (3, 7)
x, y = punto
print(f"x={x}, y={y}")

persona = ("Marta", 31, "Valencia")
nombre, edad, ciudad = persona
print(nombre, edad, ciudad)
Resultado
x=3, y=7
Marta 31 Valencia

El desempaquetado ampliado captura una parte variable con *. Una tupla de un elemento necesita coma: (42,).

Python
primero, *centro, ultimo = [10, 20, 30, 40, 50]
print(primero, centro, ultimo)
print(type((42,)).__name__, type((42)).__name__)
Resultado
10 [20, 30, 40] 50
tuple int

3. Diccionarios: pares clave–valor

Un diccionario relaciona claves únicas con valores. Conserva el orden de inserción. Las claves deben ser hashables (por ejemplo, cadenas, números o tuplas inmutables).

Python
usuario = {"nombre": "Nora", "nivel": 2, "activo": True}
usuario["nivel"] += 1
usuario["ciudad"] = "Sevilla"

print(usuario["nombre"])
print(usuario.get("telefono", "sin teléfono"))
print(usuario)
Resultado
Nora
sin teléfono
{'nombre': 'Nora', 'nivel': 3, 'activo': True, 'ciudad': 'Sevilla'}

Acceder con diccionario[clave] falla si no existe; get permite un valor predeterminado. Para recorrer, usa items() cuando necesites clave y valor.

Python
inventario = {"teclado": 4, "ratón": 7, "monitor": 2}

for producto, unidades in inventario.items():
    estado = "reponer" if unidades < 3 else "ok"
    print(f"{producto:8} {unidades:2}{estado}")
Resultado
teclado   4 → ok
ratón     7 → ok
monitor   2 → reponer

4. Conjuntos: elementos únicos

Un set no conserva posiciones y elimina duplicados. Es ideal para pertenencia y operaciones matemáticas: unión |, intersección &, diferencia - y diferencia simétrica ^.

Python
inscritos_python = {"Ana", "Luis", "Eva", "Omar"}
inscritos_sql = {"Eva", "Omar", "Sara"}

print("En ambos:", inscritos_python & inscritos_sql)
print("En alguno:", inscritos_python | inscritos_sql)
print("Solo Python:", inscritos_python - inscritos_sql)
print("Personas únicas:", len(inscritos_python | inscritos_sql))
Resultado
En ambos: {'Eva', 'Omar'}
En alguno: {'Sara', 'Luis', 'Eva', 'Omar', 'Ana'}
Solo Python: {'Luis', 'Ana'}
Personas únicas: 5

5. Comprensiones

Las comprensiones construyen colecciones a partir de iterables. Son claras para una transformación y, como máximo, un filtro sencillo. Si la lógica crece, usa un bucle o una función.

Python
numeros = range(1, 8)
cuadrados = [n ** 2 for n in numeros]
paridad = {n: "par" if n % 2 == 0 else "impar" for n in numeros}
iniciales = {nombre[0] for nombre in ["Ada", "Alan", "Grace", "Guido"]}

print(cuadrados)
print(paridad)
print(iniciales)
Resultado
[1, 4, 9, 16, 25, 36, 49]
{1: 'impar', 2: 'par', 3: 'impar', 4: 'par', 5: 'impar', 6: 'par', 7: 'impar'}
{'G', 'A'}

6. Alias y copias

La asignación de una colección mutable crea otro nombre para el mismo objeto. list.copy() hace una copia superficial: duplica el contenedor exterior, no los objetos anidados. copy.deepcopy() duplica recursivamente.

Python
import copy

original = [[1, 2], [3, 4]]
alias = original
superficial = original.copy()
profunda = copy.deepcopy(original)

original[0].append(99)
print("Alias:", alias)
print("Superficial:", superficial)
print("Profunda:", profunda)
Resultado
Alias: [[1, 2, 99], [3, 4]]
Superficial: [[1, 2, 99], [3, 4]]
Profunda: [[1, 2], [3, 4]]

7. Herramientas de collections

La biblioteca estándar aporta estructuras especializadas: Counter cuenta, defaultdict crea valores por defecto y deque añade o extrae eficientemente por ambos extremos.

Python
from collections import Counter, defaultdict, deque

conteo = Counter("abracadabra")
grupos = defaultdict(list)
for nombre, ciudad in [("Ana", "Lugo"), ("Leo", "León"), ("Eva", "Lugo")]:
    grupos[ciudad].append(nombre)

cola = deque(["primero", "segundo"])
cola.append("tercero")

print(conteo.most_common(3))
print(dict(grupos))
print(cola.popleft(), list(cola))
Resultado
[('a', 5), ('b', 2), ('r', 2)]
{'Lugo': ['Ana', 'Eva'], 'León': ['Leo']}
primero ['segundo', 'tercero']

Guía de elección

Necesidad Estructura
Secuencia ordenada y modificable list
Registro ordenado e inmutable tuple
Relación clave–valor dict
Unicidad y pertenencia rápida set
Cola de doble extremo collections.deque

Error habitual: usar una lista como valor predeterminado compartido o copiar una estructura anidada superficialmente sin advertirlo. Veremos el primer caso en funciones.

Práctica · Estadísticas de palabras

Implementa estadisticas(texto):

  1. Normaliza el texto a minúsculas y separa por espacios.
  2. Devuelve un diccionario con total de palabras, palabras únicas y la más común.
  3. Ignora comas y puntos sencillos.
Tu turno
def estadisticas(texto):
    # TODO: limpia, cuenta y devuelve un diccionario.
    pass
Ver una solución posible
Solución
from collections import Counter

def estadisticas(texto):
    limpias = texto.lower().replace(",", "").replace(".", "").split()
    frecuencias = Counter(limpias)
    mas_comun = frecuencias.most_common(1)[0] if limpias else (None, 0)
    return {
        "total": len(limpias),
        "unicas": len(set(limpias)),
        "mas_comun": mas_comun,
    }

resultado = estadisticas("Python es claro, y Python es práctico.")
print(resultado)
assert resultado == {"total": 7, "unicas": 5, "mas_comun": ("python", 2)}
Resultado
{'total': 7, 'unicas': 5, 'mas_comun': ('python', 2)}

Comprobación rápida

  • [ ] Puedo justificar qué estructura usar para un problema.
  • [ ] Sé recorrer claves y valores sin manejar índices.
  • [ ] Comprendo la diferencia entre alias, copia superficial y profunda.

← Anterior · Volver al índice · Siguiente →