Listas

Una variable guarda una cosa. Una lista guarda muchas cosas en orden, todas bajo un mismo nombre. Una tabla de clasificación es una secuencia ordenada de puntuaciones. Un cuestionario es una colección de preguntas. Cuando necesitas manejar un grupo de valores relacionados, necesitas una lista.
Crear una lista
Corchetes cuadrados, valores separados por comas. Las listas pueden contener cualquier mezcla de tipos, y una lista vacía es válida y común como punto de partida que construyes con el tiempo.
scores = [87, 92, 74, 65, 91]
players = ["María", "Carlos", "Juan"]
mixed = ["María", 87, True, 3.14] # cualquier tipo, aunque poco común
empty = [][] vacío es un buen punto de partida cuando planeas llenarlo conforme avances. La mayoría de mis listas comienzan así, vacías y esperando. Indexación y división
Las listas usan la misma numeración que las cadenas: las posiciones comienzan en 0, los números negativos cuentan desde el final. Puedes leer cualquier elemento por su posición. Porque las listas son mutables, también puedes escribir en una posición específica.
scores = [87, 92, 74, 65, 91]
scores[0] # 87 (primero)
scores[-1] # 91 (último)
scores[1:3] # [92, 74]
scores[:2] # [87, 92]
scores[::-1] # [91, 65, 74, 92, 87] (invertido)
scores[0] = 90 # mutable: funciona (las cadenas lanzarían TypeError)0, y los números negativos cuentan hacia atrás desde el final, entonces scores[-1] es el último. Una división como scores[1:3] te entrega una lista nueva con las posiciones 1 y 2. La parte que me tomó un momento: con una lista también puedes escribir en una posición, scores[0] = 90, donde una cadena se rehusamía. Añadir elementos
Tres métodos para añadir elementos. append() añade un único elemento al final y es lo que usarás casi siempre. insert() añade en una posición específica. extend() fusiona otra lista.
scores = [87, 92, 74]
scores.append(65) # [87, 92, 74, 65]
scores.insert(1, 100) # [87, 100, 92, 74, 65]
scores.extend([55, 71]) # [87, 100, 92, 74, 65, 55, 71]Un error común: append() con una lista añade toda la lista como un elemento, dándote una lista dentro de una lista. Usa extend() para fusionar en su lugar:
scores.append([55, 71]) # [..., [55, 71]] lista anidada, probablemente incorrecto
scores.extend([55, 71]) # [..., 55, 71] fusionado, correctoappend() agrega un elemento al final y es lo que alcanzarás casi cada vez. insert() coloca un elemento en una posición, extend() fusiona otra lista. El error clásico: append() una lista y obtienes una lista dentro de tu lista, así que usa extend() cuando quieras fusionar. Remover elementos
Cuatro herramientas para remover elementos. remove() busca por valor. pop() remueve por posición y te devuelve el elemento. del remueve por posición sin valor de retorno. clear() vacía la lista completa.
scores = [87, 92, 74, 65, 91]
scores.remove(74) # remueve la primera ocurrencia de 74
scores.pop() # remueve y devuelve el último elemento (91)
scores.pop(0) # remueve y devuelve el elemento en la posición 0 (87)
del scores[1] # remueve en la posición 1, sin valor de retorno
scores.clear() # remueve todoremove() lanza un ValueError si el valor no está en la lista. Verifica con in primero si no estás seguro:
if 74 in scores:
scores.remove(74)remove() elimina por valor y solo la primera coincidencia, y lanza ValueError si el valor no está allí, así que verifica con in primero cuando no estés seguro. pop() remueve por posición y devuelve el elemento, del remueve por posición y no te devuelve nada. Ordenamiento
sorted() devuelve una lista nueva ordenada y deja tu original intacta. .sort() ordena la lista en el lugar y devuelve None. Esa diferencia importa más de lo que suena.
scores = [87, 42, 96, 55, 71]
ranked = sorted(scores) # [42, 55, 71, 87, 96] (lista nueva)
scores.sort() # ordena en el lugar, devuelve None
scores.sort(reverse=True) # [96, 87, 71, 55, 42]
result = scores.sort() # result es None, no la lista ordenadasorted() te da una lista nueva ordenada y deja el original solo. .sort() reorganiza la lista misma y devuelve None, entonces x = scores.sort() te deja con None, no con la lista. Cometí ese error exacto más de una vez antes de que se me quedara. Operaciones útiles
Python tiene un conjunto de herramientas integradas que funcionan directamente en listas. len(), sum(), min(), y max() son los cuatro que alcanzarás constantemente.
scores = [87, 92, 74, 65, 91]
len(scores) # 5
sum(scores) # 409
min(scores) # 65
max(scores) # 92
scores.count(87) # 1
scores.index(74) # 2
74 in scores # True
74 not in scores # False
scores.copy() # copia superficial
scores.reverse() # invierte en el lugarlen(), sum(), min(), y max() funcionan directamente en una lista, sin configuración. in pregunta si algo está presente, .count() cuenta cuántas veces, y .index() encuentra la posición de la primera coincidencia. Iterando
Un bucle for va a través de una lista un elemento a la vez. La variable después de for recibe cada elemento por turno. Cuando también necesitas la posición, enumerate() te da ambas sin un contador manual.
players = ["María", "Carlos", "Juan"]
for player in players:
print(player)
for i, player in enumerate(players, start=1):
print(f"{i}. {player}")
# 1. María
# 2. Carlos
# 3. Juanfor y enumerate() obtienen tratamiento completo en el capítulo Control de flujo. La versión corta: for player in players corre una vez por elemento, y enumerate() te da tanto la posición como el valor en cada iteración.
for camina la lista un elemento a la vez, y el nombre después de for se convierte en ese elemento cada turno. Cuando también quieres la posición, enumerate() te entrega ambas, así nunca tienes que mantener un contador tu mismo. Dejar que contara por mí me ahorró un montón de errores de uno más. Listas anidadas
Una lista puede contener otras listas. Esta es la forma de representar una cuadrícula o una tabla: una lista de filas, cada fila siendo una lista de valores. Dos juegos de corchetes cuadrados acceden a un elemento: el primero elige la fila, el segundo elige la columna.
grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
grid[0] # [1, 2, 3]
grid[1][2] # 6 (fila 1, columna 2)grid[1][2], el primero elige la fila, el segundo elige de ella. Mutabilidad: el gotcha
Esto sorprende a casi todos. Asignar una lista a una nueva variable no hace una copia. Ambos nombres apuntan a la misma lista. Cambia una y cambias la otra. Para obtener una copia independiente, tienes que pedirla explícitamente.
a = [1, 2, 3]
b = a # b no es una copia; apunta a la misma lista
b.append(4)
print(a) # [1, 2, 3, 4] (cambiado: a y b son la misma lista)b = a.copy() # copia independiente
b = list(a) # mismo resultado
b = a[:] # también lo mismo
# Las listas anidadas aún comparten sus objetos internos:
matrix = [[1, 2], [3, 4]]
copy = matrix.copy()
copy[0].append(99)
print(matrix) # [[1, 2, 99], [3, 4]] (lista interna fue compartida)b = a no hace una copia, ambos nombres apuntan a la misma lista, así un cambio a través de uno aparece a través del otro. Para una lista independiente tienes que pedirla: .copy(), list(a), o a[:]. Este sorprende a casi todos la primera vez, a mí incluido. Más métodos
| Método | Lo que hace |
|---|---|
.append(item) | Añade al final |
.insert(i, item) | Inserta en la posición i |
.extend(iterable) | Añade todos los elementos de un iterable |
.remove(value) | Remueve la primera ocurrencia del valor |
.pop(i) | Remueve y devuelve el elemento en la posición i (predeterminado: último) |
.clear() | Remueve todos los elementos |
.index(value) | Posición de la primera ocurrencia |
.count(value) | Número de ocurrencias |
.sort() | Ordena en el lugar |
.reverse() | Invierte en el lugar |
.copy() | Devuelve una copia superficial |
En la práctica
Construyendo un rastreador de puntuaciones: añade resultados, ordénalos, e imprime un resumen.
scores = []
scores.append(87)
scores.append(54)
scores.append(92)
scores.append(67)
scores.append(45)
scores.sort(reverse=True)
print(f"Puntuaciones clasificadas: {scores}")
print(f"Mayor: {scores[0]}")
print(f"Menor: {scores[-1]}")
print(f"Promedio: {sum(scores) / len(scores):.1f}")
print(f"Top 3: {scores[:3]}")
