Listas en Python

Las listas son colecciones ordenadas y modificables. Son el equivalente de los arrays en otros lenguajes — pero mucho más poderosas.

¿Qué es una Lista?

Una lista guarda múltiples valores en una sola variable, en un orden específico. Pueden contener cualquier tipo de dato, e incluso mezclarlos.

frutas    = ["manzana", "naranja", "uva"]
numeros   = [1, 2, 3, 4, 5]
mixta     = ["Ana", 28, True, 3.14]
vacia     = []

print(frutas)    # ['manzana', 'naranja', 'uva']
print(len(frutas))  # 3
Listas vs Strings

Las listas se definen con [] y pueden modificarse. Los strings se definen con "" y son inmutables. Ambas soportan indexing y slicing de la misma manera.

Probá el Ejemplo 1: Crear y acceder a listas

Acceder a elementos

Igual que los strings, las listas usan índices empezando desde 0.

frutas = ["manzana", "naranja", "uva", "pera", "kiwi"]
#          [0]        [1]        [2]    [3]     [4]
#          [-5]       [-4]       [-3]   [-2]    [-1]

print(frutas[0])    # "manzana"
print(frutas[-1])   # "kiwi" — último elemento
print(frutas[1:3])  # ["naranja", "uva"] — slicing
print(frutas[:2])   # ["manzana", "naranja"]
print(frutas[2:])   # ["uva", "pera", "kiwi"]
A diferencia de los strings, las listas sí se pueden modificar

frutas[0] = "melón" funciona perfectamente — reemplaza "manzana" por "melón".

Métodos para agregar y quitar elementos

Agregar

frutas = ["manzana", "naranja"]

frutas.append("uva")         # agrega al final → [..., "uva"]
frutas.insert(1, "kiwi")     # inserta en posición 1 → ["manzana", "kiwi", "naranja", "uva"]
frutas.extend(["pera", "mango"])  # agrega varios al final

print(frutas)

Quitar

frutas = ["manzana", "naranja", "uva", "naranja"]

frutas.remove("naranja")  # quita la PRIMERA ocurrencia
print(frutas)             # ["manzana", "uva", "naranja"]

eliminado = frutas.pop()  # quita y devuelve el último
print(eliminado)          # "naranja"

eliminado = frutas.pop(0) # quita y devuelve el de posición 0
print(eliminado)          # "manzana"

frutas.clear()            # vacía toda la lista
remove() vs pop()

remove(valor) busca por valor. pop(índice) quita por posición y devuelve el elemento. Si no encontrás el valor con remove(), Python lanza un ValueError.

Probá el Ejemplo 2: Agregar y quitar elementos

Ordenar y organizar

numeros = [3, 1, 4, 1, 5, 9, 2, 6]
nombres = ["Carlos", "Ana", "Beatriz", "Diego"]

# sort() — modifica la lista original
numeros.sort()                    # [1, 1, 2, 3, 4, 5, 6, 9]
numeros.sort(reverse=True)        # [9, 6, 5, 4, 3, 2, 1, 1]
nombres.sort()                    # ['Ana', 'Beatriz', 'Carlos', 'Diego']

# sorted() — devuelve una lista nueva, no modifica la original
original = [3, 1, 4, 1, 5]
nueva = sorted(original)
print(original)  # [3, 1, 4, 1, 5] — sin cambios
print(nueva)     # [1, 1, 3, 4, 5]

# reverse() — invierte el orden (no ordena)
numeros.reverse()

# Otras operaciones útiles
print(min(numeros))    # el menor
print(max(numeros))    # el mayor
print(sum(numeros))    # suma total

Recorrer listas con for

frutas = ["manzana", "naranja", "uva"]

# Iterar directamente
for fruta in frutas:
    print(fruta)

print()

# Con enumerate() — también obtenés el índice
for i, fruta in enumerate(frutas):
    print(f"{i}: {fruta}")

print()

# enumerate() con índice personalizado
for i, fruta in enumerate(frutas, 1):
    print(f"{i}. {fruta}")

List comprehension — la forma pythónica

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Forma tradicional
pares = []
for n in numeros:
    if n % 2 == 0:
        pares.append(n)

# List comprehension — equivalente, más conciso
pares = [n for n in numeros if n % 2 == 0]
print(pares)  # [2, 4, 6, 8, 10]

# Con transformación
cuadrados = [n ** 2 for n in numeros]
print(cuadrados)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# Mayúsculas de frutas que tengan más de 5 letras
frutas = ["manzana", "uva", "naranja", "kiwi", "banana"]
largas = [f.upper() for f in frutas if len(f) > 5]
print(largas)  # ['MANZANA', 'NARANJA', 'BANANA']
Probá el Ejemplo 3: Recorrer y list comprehension

Métodos útiles

append(x)

lista.append(5)

Agrega al final

insert(i, x)

lista.insert(0, 5)

Inserta en posición i

remove(x)

lista.remove(5)

Quita la primera ocurrencia

pop(i)

lista.pop()

Quita y devuelve el último (o el de posición i)

index(x)

lista.index(5)

Posición de la primera ocurrencia

count(x)

lista.count(5)

Cuántas veces aparece x

sort()

lista.sort()

Ordena la lista en su lugar

copy()

copia = lista.copy()

Crea una copia independiente

Ejemplo Completo

Sistema de gestión de tareas con listas:

tareas = []

def agregar(tarea):
    tareas.append({"tarea": tarea, "hecha": False})
    print(f"✓ Agregada: {tarea}")

def completar(indice):
    if 0 <= indice < len(tareas):
        tareas[indice]["hecha"] = True
        print(f"✓ Completada: {tareas[indice]['tarea']}")

def mostrar():
    print("\n--- TAREAS ---")
    for i, t in enumerate(tareas):
        estado = "✅" if t["hecha"] else "⬜"
        print(f"{estado} {i+1}. {t['tarea']}")
    pendientes = sum(1 for t in tareas if not t["hecha"])
    print(f"\n{pendientes} tarea(s) pendiente(s)")

agregar("Estudiar Python")
agregar("Hacer ejercicio")
agregar("Leer un libro")
completar(0)
mostrar()
Probá el Ejemplo 4: Gestor de tareas

Buenas Prácticas

  • Usá list comprehension para crear listas a partir de otras — es más legible y más rápido
  • copy() para copiar — lista2 = lista1 no copia, crea otra referencia al mismo objeto
  • in para verificar existencia — if "manzana" in frutas es más claro que index()
  • enumerate() en vez de range(len()) — más pythónico y legible
  • sorted() si no querés modificar el original — sort() modifica en el lugar