Ir al contenido
wannacode

Listas

En resumen: Una lista es una secuencia de valores bajo un mismo nombre, en la que cada elemento tiene un número, su índice desde 0, y que crece con append.

Problema

Treinta notas

Una profesora escribe un programa para las notas de un examen. Para cinco estudiantes crea cinco variables:

score1 = 62
score2 = 85
score3 = 47
score4 = 91
score5 = 78
total = score1 + score2 + score3 + score4 + score5
print(total)
Salida
363

Pero en la clase hay treinta. Treinta variables, treinta sumandos. Y para la nota más alta hacen falta otras veintinueve comparaciones. El bucle de la lección anterior no ayuda: no puede recorrer score1, score2, score3, porque son nombres distintos. Necesitamos muchos valores bajo un solo nombre.

La idea

Una lista: una fila de cajas

Una lista (list) es una fila de valores bajo un mismo nombre. Cada valor, un elemento de la lista, tiene un número: su índice. Los índices empiezan en 0. En Java y C# lo mismo se llama array (o arreglo).

scores = [62, 85, 47, 91, 78]
print(scores[0])
print(scores[4])
print(len(scores))
scores[2] = 50
print(scores[2])
Salida
62
78
5
50
  • Los valores van entre corchetes [ ], separados por comas. No escribes ningún tipo. Puedes mezclar números y texto en una misma lista, pero normalmente todos los elementos son del mismo tipo.
  • scores[0] es el primer elemento, scores[4] el quinto. El último índice siempre es 1 menos que la cantidad.
  • len(scores) es la cantidad de elementos. Aquí es 5.
  • scores[2] = 50 cambia un elemento. Los demás siguen igual.

Si todavía no conoces los valores, pero sabes cuántos son, multiplicas una lista con un solo cero por la cantidad:

booked = [0] * 3
booked[1] = 2
print(booked)
Salida
[0, 2, 0]

A diferencia de los arrays de Java y C#, una lista crece. append añade un elemento al final:

scores = [62, 85]
scores.append(47)
print(scores)
print(len(scores))
Salida
[62, 85, 47]
3

print de una lista entera muestra sus elementos entre [ ]. Es práctico para comprobar, pero para la salida del programa normalmente imprimes tú los elementos.

Más precisamente, para curiosos
  • Un índice negativo cuenta desde el final: scores[-1] es el último elemento, scores[-2] el anterior.
scores = [62, 85, 47, 91, 78]
print(scores[-1])
print(scores[-2])
Salida
78
91

Pruébalo

¿Cuál es cuál?

¿Qué imprimirá el programa?

prices = [12, 7, 30, 5]
print(prices[1] + prices[3])
Respuesta

La idea

Un bucle por la lista

Ahora el bucle sí ayuda. El contador i se convierte en el índice: va de 0 hasta el último y en cada vuelta toma scores[i].

scores = [62, 85, 47, 91, 78]
total = 0
for i in range(len(scores)):
total += scores[i]
print(f"Suma: {total}")
print(f"Media: {total / len(scores)}")
Salida
Suma: 363
Media: 72.6

El contador recorre range(len(scores)): de 0 a len(scores) - 1, justo los índices. Si pones las treinta notas entre [ ], el bucle no cambia. Esto se llama recorrer la lista.

/ en Python siempre da un número decimal, así que la media sale 72,6 sin nada más. La división entera es //.

Más precisamente, para curiosos

Python también tiene funciones ya hechas para esto: sum(scores) es la suma, max(scores) y min(scores) son el mayor y el menor. Aquí las escribimos nosotros, para que veas cómo funcionan. Por eso la variable se llama total y no sum: así el nombre sum queda libre para la función.

scores = [62, 85, 47, 91, 78]
print(sum(scores), max(scores), min(scores))
Salida
363 91 47

Míralo

La nota más alta

¿Cómo encuentras el número más grande? Recuerdas el más grande hasta ahora y lo sustituyes en cuanto ves uno mayor.

scores = [62, 85, 47, 91, 78]
highest = scores[0]
for i in range(1, len(scores)):
if scores[i] > highest:
highest = scores[i]
print(highest) # 91
Paso a paso, en palabras
  1. Cinco puntuaciones, una al lado de otra. Los números de abajo son los índices: de 0 a 4.
  2. highest empieza por la primera: scores[0] es 62.
  3. i = 1: 85 > 62, así que highest pasa a ser 85.
  4. i = 2: 47 no es mayor que 85. No cambia nada.
  5. i = 3: 91 > 85, así que highest pasa a ser 91.
  6. i = 4: 78 < 91. range(1, len(scores)) se ha agotado: el valor final 5 no se incluye y el bucle se detiene.
  7. La puntuación más alta es 91.

highest empieza por el primer elemento, no por 0. Si todas las notas fueran negativas, el 0 «ganaría» sin estar en la lista. Por eso también el bucle empieza en range(1, …): el primero ya está en highest.

Pruébalo

Encuentra el error

El programa debería imprimir la suma 363. En cambio, se detiene con un error:

Error
IndexError: list index out of range

¿En qué línea está el error?

Elige la línea con el error.

La idea

for … in: para cada elemento

Cuando solo necesitas los valores y no los índices, hay un bucle más corto. ¿Cuántos estudiantes aprobaron el examen (60 puntos o más)?

scores = [62, 85, 47, 91, 78]
passed = 0
for score in scores:
if score >= 60:
passed += 1
print(f"Aprobaron el examen: {passed}")
Salida
Aprobaron el examen: 4

Se lee «para cada score en scores». Es el mismo for, solo que recorre directamente los elementos de la lista en lugar de los números de range. En Java lo mismo se llama for-each. No hay contador ni índice, así que no te puedes salir de la lista.

También tiene un límite: no sabes en qué índice estás y no puedes cambiar el elemento.

Más precisamente, para curiosos
  • Si escribes score = 0 en el cuerpo, solo cambias la variable score. La lista sigue igual, y Python no te lo impide:
scores = [62, 85, 47]
for score in scores:
score = 0
print(scores)
Salida
[62, 85, 47]
  • Para cambiar elementos, o cuando necesitas el índice (por ejemplo, para el vecino scores[i + 1]), usa un for normal.

Pruébalo

Dos nombres, una lista

¿Qué imprimirá el programa?

prices = [10, 20, 30]
sale = prices
sale[0] = 5
print(prices[0])
Respuesta
Más precisamente, para curiosos

Una copia de verdad se hace con una lista nueva y un bucle:

prices = [10, 20, 30]
sale = []
for price in prices:
sale.append(price)
sale[0] = 5
print(prices[0], sale[0])
Salida
10 5

prices.copy() hace lo mismo:

prices = [10, 20, 30]
sale = prices.copy()
sale[0] = 5
print(prices[0], sale[0])
Salida
10 5

Pruébalo

Ordena las líneas

El programa debe encontrar el precio más bajo. Ordena sus líneas.

  1. print(lowest)
  2. lowest = prices[0]
  3. prices = [18, 7, 25, 12]
  4. for i in range(1, len(prices)):
  5. if prices[i] < lowest:
  6. lowest = prices[i]

Ejercicio

Cálculos con una lista

Resuelve los ejercicios en tu editor. Cada programa lee primero cuántos números hay y después los números, uno por línea:

n = int(input())
numbers = []
for i in range(n):
numbers.append(int(input()))

1. Suma, pares, impares. Imprime la suma de todos los números, la de los pares y la de los impares.

Entrada
3
1
2
3
Salida
Suma: 6
Pares: 2
Impares: 4

2. Al revés. Crea una lista nueva con los mismos números en orden inverso e imprímelo en una línea.

Entrada
5
1
2
3
4
5
Salida
5 4 3 2 1

3. Mínimo, máximo, media. Con una sola pasada por la lista, sin las funciones ya hechas min, max y sum.

Entrada
5
4
9
2
7
4
Salida
Mínimo: 2
Máximo: 9
Media: 5.2

Ejercicio

Ordenar y contar

4. Ordenación. Ordena los números del más pequeño al más grande. Pista: recorre la lista, y si dos vecinos están en el orden equivocado, intercámbialos (el intercambio es de la lección sobre variables). Repite hasta que no quede nada que intercambiar. Esto se llama ordenamiento de burbuja: los números grandes «suben como burbujas» hacia el final. No uses el numbers.sort() ya hecho: el objetivo es que lo escribas tú.

Entrada
5
42
7
19
3
25
Salida
3 7 19 25 42

5. La racha más larga. Encuentra la secuencia más larga de números iguales seguidos.

Entrada
8
2
2
5
5
5
1
5
5
Salida
El número 5, 3 veces seguidas

6. Estadística de notas. Lee notas del 2 al 6 e imprime cuántas hay de cada tipo. Pista: una lista counts de 7 elementos, en el que la nota es el índice: counts[grade] += 1.

Entrada
8
6
4
5
6
3
2
6
5
Salida
Excelente (6): 3
Muy bien (5): 2
Bien (4): 1
Suficiente (3): 1
Insuficiente (2): 1

Más ejercicios

  • Mediana. El número del medio de la lista ordenado. Para 3, 1, 4, 1, 5 la mediana es 3. Si la cantidad de números es par, la mediana es la media de los dos del medio: para 7, 1, 3, 9 es (3 + 7) / 2 = 5.
  • Lista simétrica. ¿Se lee igual de principio a fin que de fin a principio? 1 2 3 2 1 es simétrico, 1 2 3 1 no lo es.
  • Números romanos. Lee un número del 1 al 3999 e imprímelo en números romanos: 2024 es MMXXIV, 1994 es MCMXCIV. Pista: dos listas en paralelo, con los valores 1000, 900, 500, 400, 100, …, 1 y con los símbolos "M", "CM", "D", "CD", "C", …, "I". Mientras el número sea al menos el valor actual, añade el símbolo y resta el valor.

Test

Ponte a prueba

1. En la lista [62, 85, 47, 91, 78], ¿en qué índice está 91?
2. ¿Cuál es el índice del último elemento de la lista scores?
3. ¿Qué hay en la lista justo después de booked = [0] * 3?
4. El bucle es for i in range(len(scores) + 1): y lee scores[i]. ¿Qué pasa?
5. sale = prices, y luego sale[0] = 5. ¿Qué pasa con prices[0]?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·