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
- Listas
- Tuplas
- Diccionarios
- Conjuntos
- Comprensiones
- Copias
collections- 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.
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])
['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.
palabras = ["sol", "universo", "luz", "planeta"]
por_longitud = sorted(palabras, key=len)
print("Original:", palabras)
print("Ordenada:", por_longitud)
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.
punto = (3, 7)
x, y = punto
print(f"x={x}, y={y}")
persona = ("Marta", 31, "Valencia")
nombre, edad, ciudad = persona
print(nombre, edad, ciudad)
x=3, y=7 Marta 31 Valencia
El desempaquetado ampliado captura una parte variable con *. Una tupla de un elemento necesita coma: (42,).
primero, *centro, ultimo = [10, 20, 30, 40, 50]
print(primero, centro, ultimo)
print(type((42,)).__name__, type((42)).__name__)
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).
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)
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.
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}")
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 ^.
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))
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.
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)
[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.
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)
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.
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))
[('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):
- Normaliza el texto a minúsculas y separa por espacios.
- Devuelve un diccionario con total de palabras, palabras únicas y la más común.
- Ignora comas y puntos sencillos.
def estadisticas(texto):
# TODO: limpia, cuenta y devuelve un diccionario.
pass
Ver una solución posible
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)}
{'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.