🐍 Colecciones: Listas, Tuplas, Diccionarios y Sets

Listas (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]

Métodos principales de listas

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

Recorrer listas

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!")

Slicing (rebanado)

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"

Tuplas (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}")

Diccionarios (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")

Sets (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}

Comprensión de listas (list comprehension)

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}

Ejemplo completo: gestor de contactos

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.")
💡 Recuerda: Elige la colección adecuada: listas para secuencias ordenadas, tuplas para datos fijos, diccionarios para clave→valor, y sets para elementos únicos con operaciones de conjunto.

Resumen

  • Listas — Mutables, ordenadas, con []. Métodos: append, insert, pop, sort.
  • Tuplas — Inmutables, ordenadas, con (). Ideales para datos que no cambian.
  • Diccionarios — Clave→valor con {}. Acceso rápido por clave.
  • Sets — Elementos únicos y no ordenados. Operaciones: unión, intersección, diferencia.
  • Slicing[inicio:fin:paso] para subsecuencias.
  • Comprensión[x for x in ... if ...] para crear colecciones en una línea.

← Volver al curso