list)
Una lista es una colección ordenada y mutable de elementos. Se define con
corchetes [] y puede contener cualquier tipo de dato (incluso mezclados).
# Crear listas
numeros = [1, 2, 3, 4, 5]
mixta = [42, "texto", True, 3.14]
vacia = []
# Acceder a elementos (índice desde 0)
print(numeros[0]) # 1
print(numeros[-1]) # 5 (último elemento)
# Modificar elementos
numeros[0] = 10
print(numeros) # [10, 2, 3, 4, 5]
frutas = ["naranja", "manzana"]
frutas.append("plátano") # Añade al final → ["naranja", "manzana", "plátano"]
frutas.insert(1, "pera") # Inserta en posición 1 → ["naranja", "pera", "manzana", "plátano"]
frutas.remove("manzana") # Elimina por valor
ultima = frutas.pop() # Elimina y devuelve el último → "plátano"
fruta = frutas.pop(0) # Elimina y devuelve índice 0 → "naranja"
frutas.sort() # Ordena la lista (debe ser homogénea)
frutas.reverse() # Invierte el orden
indice = frutas.index("pera") # Busca posición → 0
print(len(frutas)) # Longitud → 1
colores = ["rojo", "verde", "azul"]
for color in colores:
print(color)
# Con índice
for i, color in enumerate(colores):
print(f"{i}: {color}")
# Comprobar si existe
if "verde" in colores:
print("¡El verde está en la lista!")
El slicing permite extraer porciones de secuencias con la sintaxis [inicio:fin:paso]:
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:6]) # [2, 3, 4, 5]
print(nums[:4]) # [0, 1, 2, 3] (desde inicio hasta 4)
print(nums[6:]) # [6, 7, 8, 9] (desde 6 hasta el final)
print(nums[::2]) # [0, 2, 4, 6, 8] (pares)
print(nums[1::2]) # [1, 3, 5, 7, 9] (impares)
print(nums[::-1]) # [9, 8, 7, ..., 0] (lista invertida)
# También funciona con strings
texto = "Python"
print(texto[0:3]) # "Pyt"
print(texto[::-1]) # "nohtyP"
tuple)
Una tupla es como una lista, pero inmutable (no se puede modificar
después de crearla). Se define con paréntesis ().
# Crear tuplas
coordenadas = (40.4168, -3.7038)
colores_rgb = (255, 0, 0)
tupla_vacia = ()
un_elemento = (5,) # ¡La coma es necesaria!
# Acceder (igual que listas)
print(coordenadas[0]) # 40.4168
# Las tuplas NO se pueden modificar
# coordenadas[0] = 10 # ❌ Error: TypeError
# Desempaquetado
x, y = coordenadas
print(f"Lat: {x}, Lon: {y}")
# Útil para retornar múltiples valores
def dividir(a, b):
cociente = a // b
resto = a % b
return (cociente, resto)
c, r = dividir(10, 3)
print(f"Cociente: {c}, Resto: {r}")
dict)
Un diccionario almacena pares clave-valor. Las claves deben ser únicas e inmutables
(str, int, tupla...). Se define con llaves {}.
# Crear diccionarios
alumno = {
"nombre": "Laura",
"edad": 22,
"curso": "2º DAW",
"nota_media": 8.5
}
# Acceder
print(alumno["nombre"]) # "Laura"
print(alumno.get("edad")) # 22 (más seguro, no lanza error)
print(alumno.get("peso", "N/D")) # "N/D" (valor por defecto)
# Modificar / añadir
alumno["nota_media"] = 9.0 # Actualizar
alumno["email"] = "laura@example.com" # Añadir nuevo
# Eliminar
del alumno["edad"]
email = alumno.pop("email") # Elimina y devuelve el valor
# Recorrer
for clave in alumno:
print(clave, "→", alumno[clave])
for clave, valor in alumno.items():
print(f"{clave}: {valor}")
for valor in alumno.values():
print(valor)
# Comprobar existencia
if "nombre" in alumno:
print("La clave 'nombre' existe")
set)Un set (conjunto) es una colección no ordenada de elementos únicos. Ideal para eliminar duplicados y operaciones de conjuntos.
# Crear sets
numeros = {1, 2, 3, 4, 5}
vacio = set() # No {} porque eso es un dict vacío
# Eliminar duplicados automáticamente
repetidos = [1, 2, 2, 3, 3, 3, 4]
unicos = set(repetidos)
print(unicos) # {1, 2, 3, 4}
# Métodos
numeros.add(6) # Añadir
numeros.remove(1) # Eliminar (lanza error si no existe)
numeros.discard(99) # Eliminar (no lanza error)
print(len(numeros)) # Tamaño
# Operaciones de conjuntos
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # Unión: {1, 2, 3, 4, 5, 6}
print(a & b) # Intersección: {3, 4}
print(a - b) # Diferencia: {1, 2}
print(a ^ b) # Diferencia simétrica: {1, 2, 5, 6}
La comprensión de listas es una forma concisa de crear listas aplicando
una expresión a cada elemento. Sintaxis: [expresión for elemento in iterable if condición]
# Cuadrados del 1 al 10
cuadrados = [x ** 2 for x in range(1, 11)]
print(cuadrados) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# Solo pares y sus cuadrados
pares_cuadrados = [x ** 2 for x in range(20) if x % 2 == 0]
print(pares_cuadrados) # [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]
# Convertir a mayúsculas
nombres = ["ana", "luis", "carlos"]
mayus = [n.upper() for n in nombres]
print(mayus) # ['ANA', 'LUIS', 'CARLOS']
# También con diccionarios
cuadrado_dict = {x: x ** 2 for x in range(5)}
print(cuadrado_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# Comprensión con sets
pares_set = {x for x in range(10) if x % 2 == 0}
print(pares_set) # {0, 2, 4, 6, 8}
contactos = []
while True:
print("\n=== AGENDA DE CONTACTOS ===")
print("1. Añadir contacto")
print("2. Ver contactos")
print("3. Buscar contacto")
print("4. Salir")
opcion = input("Elige: ")
if opcion == "1":
nombre = input("Nombre: ")
telefono = input("Teléfono: ")
contacto = {"nombre": nombre, "telefono": telefono}
contactos.append(contacto)
print("✅ Contacto añadido.")
elif opcion == "2":
if not contactos:
print("📭 No hay contactos.")
else:
for i, c in enumerate(contactos, 1):
print(f"{i}. {c['nombre']} → {c['telefono']}")
elif opcion == "3":
busqueda = input("Nombre a buscar: ").lower()
encontrados = [c for c in contactos if busqueda in c['nombre'].lower()]
if encontrados:
for c in encontrados:
print(f"{c['nombre']} → {c['telefono']}")
else:
print("🔍 No se encontraron contactos.")
elif opcion == "4":
print("👋 ¡Hasta luego!")
break
else:
print("❌ Opción no válida.")
[]. Métodos: append, insert, pop, sort.(). Ideales para datos que no cambian.{}. Acceso rápido por clave.[inicio:fin:paso] para subsecuencias.[x for x in ... if ...] para crear colecciones en una línea.