Listas
Una variable contiene una sola cosa. Una lista contiene muchas cosas en orden, todas bajo un mismo nombre. Una tabla de posiciones es una secuencia ordenada de puntajes. Un cuestionario es una colección de preguntas. Una vez que necesitas administrar un grupo de valores relacionados, necesitas una lista.
Creando una lista
Corchetes, valores separados por comas. Las listas pueden contener cualquier combinación de tipos, y una lista vacía es válida y común como punto de partida que vas construyendo con el tiempo.
scores = [87, 92, 74, 65, 91]
players = ["Sofía", "Mateo", "Valentina"]
mixed = ["Sofía", 87, True, 3.14] # cualquier tipo, aunque poco común
empty = []Indexación y segmentación
Las listas usan la misma numeración que las cadenas: las posiciones empiezan en 0, los números negativos cuentan desde el final. Lees cualquier elemento por su posición. Como 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)Agregando elementos
Tres métodos para agregar elementos. append() agrega un solo elemento al final y es lo que usarás casi siempre. insert() agrega 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 agrega toda la lista como un solo elemento, dándote una lista dentro de una lista. Usa extend() para fusionarla en su lugar:
scores.append([55, 71]) # [..., [55, 71]] lista anidada, probablemente incorrecto
scores.extend([55, 71]) # [..., 55, 71] fusionado, correctoEliminando elementos
Cuatro herramientas para eliminar elementos. remove() busca por valor. pop() elimina por posición y te devuelve el elemento. del elimina por posición sin valor de retorno. clear() vacía toda la lista.
scores = [87, 92, 74, 65, 91]
scores.remove(74) # elimina la primera ocurrencia de 74
scores.pop() # elimina y devuelve el último elemento (91)
scores.pop(0) # elimina y devuelve el elemento en la posición 0 (87)
del scores[1] # elimina en la posición 1, sin valor de retorno
scores.clear() # elimina todoremove() lanza un ValueError si el valor no está en la lista. Verifica primero con in si no estás seguro:
if 74 in scores:
scores.remove(74)Ordenamiento
sorted() devuelve una lista ordenada nueva y deja la original intacta. .sort() ordena la lista en el lugar y devuelve None. Esa diferencia importa más de lo que parece.
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 ordenadaOperaciones útiles
Python tiene un conjunto de herramientas integradas que funcionan directamente con listas. len(), sum(), min() y max() son las cuatro que usará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 lugarIteración
Un bucle for recorre una lista un elemento a la vez. La variable después de for recibe cada elemento en su turno. Cuando también necesitas la posición, enumerate() te da ambas sin un contador manual.
players = ["Sofía", "Mateo", "Valentina"]
for player in players:
print(player)
for i, player in enumerate(players, start=1):
print(f"{i}. {player}")
# 1. Sofía
# 2. Mateo
# 3. Valentinabucles for y enumerate
for y enumerate() se cubren completamente en el capítulo Flujo de control. Versión corta: for player in players se ejecuta una vez por elemento; enumerate() te da tanto la posición como el valor en cada iteración.
Listas anidadas
Una lista puede contener otras listas. Así es como representas una cuadrícula o una tabla: una lista de filas, donde cada fila es una lista de valores. Dos pares de corchetes 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)Mutabilidad: la trampa
Esto sorprende a casi todos. Asignar una lista a una nueva variable no hace una copia. Ambos nombres apuntan a la misma lista. Cambia uno y cambias el otro. 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] (cambió: 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]] (la lista interna se compartió)Más métodos
| Método | Qué hace |
|---|---|
.append(item) | Agrega al final |
.insert(i, item) | Inserta en la posición i |
.extend(iterable) | Agrega todos los elementos de un iterable |
.remove(value) | Elimina la primera ocurrencia del valor |
.pop(i) | Elimina y devuelve el elemento en la posición i (por defecto: último) |
.clear() | Elimina 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 puntajes: agregar resultados, ordenarlos e imprimir un resumen.
scores = []
scores.append(87)
scores.append(54)
scores.append(92)
scores.append(67)
scores.append(45)
scores.sort(reverse=True)
print(f"Puntajes clasificados: {scores}")
print(f"Más alto: {scores[0]}")
print(f"Más bajo: {scores[-1]}")
print(f"Promedio: {sum(scores) / len(scores):.1f}")
print(f"Top 3: {scores[:3]}")
