Modulo 05 — Listas y comprehensions

Idea central

En C un array es un bloque fijo de memoria del mismo tipo. En Python una lista (list) es una secuencia dinamica, heterogenea y de primera clase: puede crecer, encogerse y transformarse con una sola linea de comprehension.


Que aprendes

ConceptoPara que
Crear lista literalAgrupar valores sin declarar tipo ni tamano
Indexar y slicingAcceder a uno o varios elementos de forma expresiva
append / pop / insertModificar la lista en tiempo de ejecucion
len / sorted / sortOperaciones de medida y ordenacion
Recorrido con forIterar sin indice manual
List comprehensionTransformar/filtrar una lista en una sola expresion
inBuscar un elemento sin bucle explicito
set() sobre listaEliminar duplicados al instante

C vs Python

El mismo problema: dado un array de enteros, construir otro con solo los pares.

AspectoCPython
Declaracionint nums[] = {1,2,3,4,5};nums = [1, 2, 3, 4, 5]
Tamano fijoSi (int N = 5;)No (dinamica)
Filtrar pares (bucle)for(int i=0;i<N;i++) if(nums[i]%2==0) pares[j++]=nums[i];pares = [x for x in nums if x % 2 == 0]
Imprimir resultadofor(int i=0;i<j;i++) printf("%d ",pares[i]);print(pares)
Acceso a ultimonums[N-1]nums[-1]
Invertirbucle manual o memcpynums[::-1]

Codigo C completo:

#include <stdio.h>
int main(void) {
    int nums[] = {1, 2, 3, 4, 5};
    int N = 5;
    int pares[5];
    int j = 0;
    for (int i = 0; i < N; i++)
        if (nums[i] % 2 == 0)
            pares[j++] = nums[i];
    for (int i = 0; i < j; i++)
        printf("%d ", pares[i]);
    return 0;
}

Codigo Python equivalente:

nums = [1, 2, 3, 4, 5]
pares = [x for x in nums if x % 2 == 0]
print(pares)   # [2, 4]

Explicacion

1. Crear e indexar

frutas = ["manzana", "pera", "uva"]
print(frutas[0])   # manzana   (como C, base 0)
print(frutas[-1])  # uva       (indice negativo: desde el final)

Patron: lista[indice]. Indices negativos son exclusivos de Python y muy utiles.

2. Slicing

nums = [0, 1, 2, 3, 4, 5]
print(nums[1:4])   # [1, 2, 3]   — de indice 1 hasta 3 (4 no incluido)
print(nums[:3])    # [0, 1, 2]   — desde el inicio
print(nums[::2])   # [0, 2, 4]   — cada dos elementos
print(nums[::-1])  # [5, 4, 3, 2, 1, 0] — invertir

Patron: lista[inicio:fin:paso]. Los tres son opcionales; el paso -1 invierte.

3. Modificar: append, pop, insert

nums = [10, 20, 30]
nums.append(40)      # [10, 20, 30, 40]
nums.pop()           # [10, 20, 30]  — elimina y devuelve el ultimo
nums.pop(0)          # [20, 30]      — elimina por indice
nums.insert(1, 99)   # [20, 99, 30] — inserta en posicion

append es O(1) amortizado. insert(0, x) es O(n) (desplaza todo).

4. len, sorted, sort

nums = [3, 1, 4, 1, 5]
print(len(nums))       # 5
print(sorted(nums))    # [1, 1, 3, 4, 5] — nueva lista ordenada
nums.sort()            # ordena EN SITIO, devuelve None
nums.sort(reverse=True)

sorted() NO modifica la original. .sort() SI la modifica.

5. Recorrido

# Sin indice (Pythonic)
for fruta in frutas:
    print(fruta)
 
# Con indice cuando lo necesitas
for i, fruta in enumerate(frutas):
    print(f"{i}: {fruta}")

6. List comprehension

Patron: [expresion for elemento in iterable if condicion]

La condicion if es opcional.

cuadrados = [x**2 for x in range(6)]          # [0, 1, 4, 9, 16, 25]
pares      = [x for x in range(10) if x%2==0] # [0, 2, 4, 6, 8]
dobles     = [x*2 for x in [1,2,3]]           # [2, 4, 6]

7. Buscar con in

colores = ["rojo", "verde", "azul"]
print("verde" in colores)   # True
print("negro" in colores)   # False

in recorre la lista linealmente (O(n)). Para busquedas frecuentes, usar set.

8. Eliminar duplicados con set

nums = [3, 1, 4, 1, 5, 3, 2]
unicos = list(set(nums))   # orden NO garantizado
print(sorted(unicos))      # [1, 2, 3, 4, 5] — ordenar para salida reproducible

set() convierte la lista en un conjunto (sin duplicados). El orden original se pierde.


Worked example

Problema: dada una lista de notas enteras, calcular media, nota maxima, nota minima, y devolver las notas aprobadas (>= 5) ordenadas de mayor a menor.

Paso 1 — Datos:

notas = [3, 7, 5, 2, 9, 6, 4]

Paso 2 — Media:

media = sum(notas) / len(notas)
print(f"Media: {media:.2f}")   # Media: 5.14

sum() es funcion builtin; len() da el numero de elementos.

Paso 3 — Maximo y minimo:

print(f"Max: {max(notas)}, Min: {min(notas)}")   # Max: 9, Min: 2

Paso 4 — Aprobados con comprehension:

aprobadas = [n for n in notas if n >= 5]
aprobadas.sort(reverse=True)
print(f"Aprobadas: {aprobadas}")   # Aprobadas: [9, 7, 6, 5]

Programa completo:

notas = [3, 7, 5, 2, 9, 6, 4]
media = sum(notas) / len(notas)
print(f"Media: {media:.2f}")
print(f"Max: {max(notas)}, Min: {min(notas)}")
aprobadas = sorted([n for n in notas if n >= 5], reverse=True)
print(f"Aprobadas: {aprobadas}")

Errores tipicos de Python

#ErrorEjemplo maloCorrecto
1input() devuelve str, no intn = input(); total = n + 1n = int(input()); total = n + 1
2Indice fuera de rangolista[len(lista)]lista[len(lista)-1] o lista[-1]
3.sort() devuelve Noneordenada = lista.sort()lista.sort() (in-place) o ordenada = sorted(lista)
4Copiar lista por referenciab = a; b.append(99) modifica ab = a[:] o b = list(a)
5Modificar lista mientras se iterafor x in lista: if ...: lista.remove(x)Iterar sobre una copia: for x in lista[:]

Ejercicios

Los archivos de practica estan en practica/05-listas/.

  1. Suma y media — Pide al usuario N numeros enteros y calcula su suma y media.

    • Dificultad: (facil)
    • Salida esperada (entrada: 3 7 2): Suma: 12 Media: 4.00
    • Practica: practica/05-listas/ej01_practica.py | Modelo: ej01_modelo.py
  2. Maximo y minimo — Dada una lista hardcodeada, imprime el mayor y el menor sin usar max()/min() (usa un bucle manual).

    • Dificultad: (facil)
    • Salida esperada (lista [4, 1, 9, 3, 7]): Max: 9 Min: 1
    • Practica: practica/05-listas/ej02_practica.py | Modelo: ej02_modelo.py
  3. Invertir con slicing — Pide una lista de palabras separadas por espacio e imprimela al reves.

    • Dificultad: (facil)
    • Salida esperada (entrada: hola mundo python): ['python', 'mundo', 'hola']
    • Practica: practica/05-listas/ej03_practica.py | Modelo: ej03_modelo.py
  4. Filtrar pares — Dada una lista de enteros del 1 al 20, usa una comprehension para extraer solo los pares.

    • Dificultad: (facil)
    • Salida esperada: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
    • Practica: practica/05-listas/ej04_practica.py | Modelo: ej04_modelo.py
  5. Cuadrados con comprehension — El usuario introduce N; imprime la lista de cuadrados de 1 a N.

    • Dificultad: (media)
    • Salida esperada (N=5): [1, 4, 9, 16, 25]
    • Practica: practica/05-listas/ej05_practica.py | Modelo: ej05_modelo.py
  6. Buscar elemento — Pide una lista de nombres y un nombre a buscar; informa si esta o no, y en que posicion (usa in e index()).

    • Dificultad: (media)
    • Salida esperada (lista ana luis maria, buscar luis): "luis" encontrado en posicion 1
    • Practica: practica/05-listas/ej06_practica.py | Modelo: ej06_modelo.py
  7. Eliminar duplicados — El usuario ingresa una lista de enteros con repetidos; imprime la lista sin duplicados, ordenada.

    • Dificultad: (media)
    • Salida esperada (entrada: 3 1 4 1 5 3 2): [1, 2, 3, 4, 5]
    • Practica: practica/05-listas/ej07_practica.py | Modelo: ej07_modelo.py

Conexiones