Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Ciclos anidados 🔄 Python: Listas

En proyectos reales a veces recibes listas con listas dentro. Queremos una función que aplane la lista (solo un nivel) para trabajar más cómodo.

💡 A esto lo llamamos flatten (aplanar). Aquí haremos una versión simple: solo revela el primer nivel.

Una lista aplanada es una lista que ya no tiene listas dentro: todos los elementos están al mismo nivel.

Antes: [1, [2, 3], 4] ⮕ Después: [1, 2, 3, 4]

¿Por qué necesitamos flatten?

  • Para unir resultados que llegaron por partes.
  • Para limpiar datos antes de contarlos/ordenarlos.
  • Para evitar bucles repetidos en todos lados.

Ejemplo:

La función recibe (entrada) una lista con elementos mezclados, revisa uno por uno (proceso), y devuelve (salida) una lista plana.

Entrada:

[3, 2, [], [3, 4, 2], 3, [123, 3]]

Salida esperada:

[3, 2, 3, 4, 2, 3, 123, 3]

Cómo lo hacemos en código


def flatten(coll):
    result = []                     # acumulamos aquí
    for item in coll:               # recorremos cada elemento
        if isinstance(item, list):  # si es una lista, la "revelamos"
            for sub_item in item:   # bucle anidado SOLO cuando toca
                result.append(sub_item)
        else:                       # si NO es lista, lo agregamos tal cual
            result.append(item)
    return result


print(flatten([3, 2, [], [3, 4, 2], 3, [123, 3]]))
# => [3, 2, 3, 4, 2, 3, 123, 3]

👉 El bucle anidado aparece solo cuando encontramos una sublista.

Mejora: sacar la lógica repetida a una función

Para que el código sea más claro, extraemos “agregar todos los elementos de otra lista” a un helper.

⚠️ Lo llamamos extend_list para no confundir con el método .append() de las listas.


def extend_list(dst, src):
    """Agrega todos los elementos de src dentro de dst (modifica dst)."""
    for item in src:
        dst.append(item)

def flatten(coll):
    result = []
    for item in coll:
        if isinstance(item, list):
            extend_list(result, item)  # usamos el helper
        else:
            result.append(item)
    return result


print(flatten([3, [1, 2], ['a', 'b'], [], 5]))
# => [3, 1, 2, 'a', 'b', 5]

💡 Nota: nuestro extend_list() es solo un helper educativo. El método real list.extend(...) existe en Python y hace lo mismo más eficientemente.

¿Y los ciclos anidados… son malos?

Los ciclos anidados aparecen en muchos programas. No siempre son un error, pero sí pueden:

  • hacer el código más difícil de leer,
  • aumentar la cantidad de variables que cambian al mismo tiempo,
  • y, a veces, indicar un algoritmo poco eficiente.
Opciones que tienes cuando ves un ciclo anidado:
  • No hacer nada: a veces están bien, sobre todo en algoritmos simples o de bajo nivel.
  • Reescribir el algoritmo: buscar otra forma de resolver el problema sin anidar bucles.
  • Sacarlo a una función: como hicimos con extend_list(), o reemplazarlo por un método incorporado como extend().

Errores típicos (y cómo evitarlos)

❌ Sobrescribir nombres confusos: no crees def append(...) ⮕ Usa extend_list o llama directamente a result.extend(sublista).

❌ Modificar la lista que recorres en el mismo bucle (agregar/eliminar del iterable actual) ⮕ Acumula en result y deja la original en paz.

❌ Aplanar más de lo que toca: esta versión no es recursiva ⮕ Si necesitas todos los niveles, tendrás que usar recursión o un stack (tema avanzado).

Versión usando métodos de lista

def flatten(coll):
    result = []
    for item in coll:
        if isinstance(item, list):
            result.extend(item)  # equivalente a nuestro extend_list()
        else:
            result.append(item)
    return result


Resumen

  • Flatten significa “aplanar”: convertir una lista con sublistas en una lista plana con todos los elementos al mismo nivel.
  • La versión básica usa un bucle anidado solo cuando encuentra una sublista.
  • Los ciclos anidados no siempre son un error, pero pueden complicar el código. Opciones: dejarlos, reescribir el algoritmo o sacarlos a una función/método.
  • Evita errores comunes: no sobrescribas nombres como append, no modifiques la lista que recorres y recuerda que esta versión no es recursiva.
  • En Python existe list.extend(), que hace lo mismo que nuestro helper extend_list() de forma más directa.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY