Listas y estadística
Una lista reúne varios valores bajo un mismo nombre, como los pasos de una semana, las notas de unos exámenes o los tiques de un mes. Una vez que los valores están en una lista, puedes sumarlos, calcular su media, medir su dispersión y quedarte con los que importan.
Esta página explica cómo escribir listas y acceder a sus elementos, las estadísticas descriptivas,
cómo ordenar y extraer partes, cómo transformar una lista con map y filter, y la aritmética con
listas completas. Te servirá siempre que tengas una columna de cifras que resumir. Las listas de
filas también pueden funcionar como matrices, que tienen su propia página.
Escribir una lista
Escribe los valores entre corchetes, separados por comas:
notas = [72, 85, 91, 64, 88] da [72, 85, 91, 64, 88]notas[0] da 72notas[4] da 88length(notas) da 5La posición de un valor en la lista es su índice, que se escribe entre corchetes después de la
lista. Los índices empiezan en cero, así que notas[0] es la primera nota y notas[4] es la
quinta. El último elemento siempre está en length(notas) - 1. Un índice negativo, fraccionario o
demasiado grande da un error; los índices no vuelven a empezar desde el final.
Los elementos pueden ser cálculos, cantidades con unidades u otras listas:
[2 * 45, 60 + 15] da [90, 75][1.5 kg, 750 g] da [1.5 kg, 750 g][[1, 2], [3, 4]][1][0] da 3Con listas anidadas, el primer índice elige la lista interior y el segundo elige un valor de ella:
[1] selecciona [3, 4] y luego [0] selecciona 3.
Los separadores de miles funcionan dentro de una lista, así que puedes pegar las cifras tal como están escritas. Pon un espacio después de cada coma entre valores; una coma seguida de tres dígitos sigue formando parte del número:
sueldos = [32,000 €, 41,500 €, 38,250 €] da [€32,000.00, €41,500.00, €38,250.00]average(sueldos) da €37,250.00Ten en cuenta lo siguiente:
- Sin espacios, cada coma separa, así que
[8200,10400]tiene dos valores. Una lista como[100,200,300]podría ser un número o tres, así que Varlig muestra un error que explica las dos opciones. - Los resultados muestran separadores de miles y un espacio después de cada coma, así que
[8,200, 10,400]es una lista de dos valores. - Una lista contiene como máximo 1,024 valores.
Estadísticas descriptivas
notas = [72, 85, 91, 64, 88]sum(notas) da 400average(notas) da 80median(notas) da 85min(notas) da 64max(notas) da 91count(notas) da 5mean y avg son otros nombres de average, total lo es de sum, stdev de stddev y count
de length, así que tus costumbres de las hojas de cálculo te sirven aquí. product multiplica los
valores entre sí. No hay función de percentil; median da el valor central.
Con una lista con nombre, también puedes escribir la estadística con palabras:
notas = [72, 85, 91, 64, 88]average of notas da 80total of notas da 400sum of, mean of, median of, min of, max of y count of funcionan igual. Después de of,
escribe un nombre o los propios valores, separados por comas, con o sin paréntesis. Para valores
entre corchetes, usa la forma de función, como en average([72, 85, 91]).
La mayoría de las estadísticas, como sum, product, average, median, min, max, count y
stddev, también aceptan valores sueltos en lugar de una lista:
max(72, 85, 91) da 91average of 70, 85, 91 da 82mean of (1,2,3) da 2average(1,200, 1,800) da 1,500Sumar las líneas de arriba
Una línea que solo contiene sum o total suma los resultados de arriba, hasta la línea sum o
total anterior o hasta un separador ---. Funciona como la opción Subtotal del
menú contextual de una línea, así que
cada sección de una nota tiene su propio total mientras escribes:
# Comprapan = 1.20 €leche = 1.45 €huevos = 2.30 €total da €4.95# Hogarbolsas de basura = 3.50 €lavavajillas = 1.80 €total da €5.30Si has dado a un valor el nombre sum o total, la línea muestra tu valor.
Dispersión: varianza y desviación típica
notas = [72, 85, 91, 64, 88]variance(notas) da 132.5stddev(notas) to 1 dp da 11.5Ambas son estadísticas muestrales: dividen entre uno menos que el número de valores (n - 1),
que es lo habitual cuando tus cifras son una muestra de algo mayor. Necesitan al menos dos valores.
Añade to 1 dp después de cualquier estadística para redondearla.
Si tu lista es la población completa, lo que quieres es dividir entre n. Calcúlalo con map,
que se explica más abajo:
# Retrasos de trenes en minutosretrasos = [2, 4, 4, 4, 5, 5, 7, 9]stddev(retrasos) da 2.1380899353centro = average(retrasos) da 5sqrt(sum(map((x - centro)^2, x, retrasos)) / count(retrasos)) da 2Listas con unidades
sum, average, median, min, max y stddev conservan las unidades y convierten entre
unidades compatibles:
trayectos = [24 min, 31 min, 27 min, 22 min]sum(trayectos) da 104 minaverage(trayectos) da 26 minmedian(trayectos) da 25.5 minsum([1 kg, 500 g]) da 1.5 kgvariance solo acepta números sin unidades, porque su resultado estaría en unidades al cuadrado.
sort también funciona solo con números sin unidades. Una estadística sobre valores con unidades
incompatibles, como sum([1 kg, 3 m]), da un error en lugar de omitir valores sin avisar.
Listas vacías
| Llamada con una lista vacía | Resultado |
|---|---|
sum([]) |
0 |
product([]) |
1 |
count([]), length([]) |
0 |
average([]), median([]), min([]), max([]) |
Error |
variance([]), stddev([]) |
Error |
Lo más habitual es que una lista vacía salga de un filter que no ha encontrado nada, así que el
average de una lista filtrada puede fallar aunque la lista original tenga valores.
Referencia de listas
| Llamada | Qué hace |
|---|---|
range(inicio,fin) |
Números enteros de inicio a fin, ambos incluidos |
range(inicio,fin,paso) |
Cuenta de paso en paso, que puede ser negativo o fraccionario, pero no cero |
length(lista), count(lista) |
Número de valores |
sort(lista) |
De menor a mayor; solo números sin unidades |
reverse(lista) |
Los mismos valores en orden inverso; cualquier valor |
unique(lista) |
Conserva la primera aparición de cada valor |
slice(lista,inicio,fin) |
Los valores desde el índice inicio hasta el índice fin, sin incluirlo |
map(expresión,variable,lista) |
Calcula la expresión una vez para cada valor |
filter(condición,variable,lista) |
Conserva los valores para los que la condición es true |
range(1, 5) da [1, 2, 3, 4, 5]range(0, 100, 25) da [0, 25, 50, 75, 100]range(10, 0, -2) da [10, 8, 6, 4, 2, 0]notas = [72, 85, 91, 64, 88]sort(notas) da [64, 72, 85, 88, 91]reverse(sort(notas)) da [91, 88, 85, 72, 64]slice(sort(notas), 0, 3) da [64, 72, 85]unique([4, 2, 4, 6, 2]) da [4, 2, 6]reverse(sort(…)) pone primero el mayor, y slice(sort(…), 0, 3) elige los tres más bajos.
Los límites de slice deben cumplir 0 <= inicio <= fin <= longitud. Si inicio y fin son
iguales, obtienes una lista vacía. No existe la forma abreviada notas[0:2]; escribe
slice(notas, 0, 2).
unique compara los valores exactamente como están guardados, así que 1 kg y 1000 g cuentan
como dos valores distintos, y dos resultados que se diferencian en el décimo decimal no se unen.
Map y filter
map calcula una expresión para cada valor de una lista. filter conserva los valores que cumplen
una condición. En ambos casos va primero la expresión, luego un nombre que representa cada valor y
después la lista:
notas = [72, 85, 91, 64, 88]map(s + 5, s, notas) da [77, 90, 96, 69, 93]filter(s >= 80, s, notas) da [85, 91, 88]count(filter(s >= 80, s, notas)) da 3average(filter(s >= 80, s, notas)) da 88Lee filter(s >= 80, s, notas) como “los valores s de notas para los que s >= 80”. Ambos
funcionan con unidades y dinero:
map(p * 1.2, p, [10 €, 25 €, 40 €]) da [€12.00, €30.00, €48.00]gastos = [42.50 €, 18.20 €, 65.00 €, 23.30 €]filter(x > 30 €, x, gastos) da [€42.50, €65.00]sum(filter(x > 30 €, x, gastos)) da €107.50El nombre que elijas solo existe dentro de la llamada. No cambia un valor con el mismo nombre en otra parte de la nota:
x = 10map(x * 2, x, [1, 2, 3]) da [2, 4, 6]x da 10La condición de filter debe ser una comparación u otro valor verdadero o falso. Un número sin más
no se trata como verdadero, así que filter(x, x, [0, 1, 2]) da un error. Aplicar map o filter
a una lista vacía da una lista vacía.
Aritmética con listas
Puedes multiplicar o dividir todos los valores por un mismo número, y sumar o restar dos listas de la misma longitud valor a valor:
[30, 36, 22] / 40 * 100 da [75, 90, 55]2 * [3, 1, 4] da [6, 2, 8]-[5, -3] da [-5, 3]simulacros = [62, 70, 60]finales = [72, 78, 69]finales - simulacros da [10, 8, 9]average(finales - simulacros) da 9[1 kg, 2 kg] + [500 g, 500 g] da [1.5 kg, 2.5 kg][72, 85] == [72, 85] da trueLa primera línea convierte notas sobre 40 en porcentajes. La línea finales - simulacros empareja
la nota del simulacro de cada alumno con su nota final.
Algunas operaciones no se pueden hacer con listas:
- Sumar un número suelto a una lista, como en
notas + 5. Usamap(s + 5, s, notas)en su lugar. - Sumar listas de distinta longitud. Los valores nunca se repiten para igualar las longitudes.
- Multiplicar dos listas planas con
*. Para la suma de los productos por pares, usadot:dot([2, 3, 1], [4, 5, 10])es33, por ejemplo dos cafés a 4, tres tés a 5 y un pastel a 10. Entre listas de filas,*es la multiplicación de matrices, que se explica en Vectores y matrices.
Listas de filas
Una lista de filas funciona como una pequeña tabla. average y sum trabajan por columnas, y map
puede trabajar fila a fila:
# Cada fila es un alumno: [simulacro, final]resultados = [[62, 72], [70, 78], [60, 69]]average(resultados) da [64, 73]sum(resultados) da [192, 219]map(average(r), r, resultados) da [67, 74, 64.5]median, min, max y stddev no aceptan listas de filas. Usa map sobre las filas, como en la
última línea, o saca una columna a su propia lista.
Las reglas exactas de todas estas operaciones están en Matemáticas avanzadas: posibilidades y límites.
Todo junto
Estos son los pasos de una semana registrados por un reloj, con un objetivo diario:
# Pasos, de lunes a domingopasos = [8200, 10400, 6300, 12000, 9100, 7400, 9600]objetivo = 9000sum(pasos) da 63,000average(pasos) da 9,000median(pasos) da 9,100Días con el objetivo cumplido: count(filter(s >= objetivo, s, pasos)) da 4Diferencia: max(pasos) - min(pasos) da 5,700# Unos 0.75 m por pasorecorrido = sum(pasos) * 0.75 mrecorrido in km da 47.25 kmLa media coincide exactamente con el objetivo, pero solo cuatro días lo alcanzaron, y hay 5,700
pasos de diferencia entre el mejor y el peor día. Cambia objetivo o pega los pasos de la semana
siguiente y todas las líneas se actualizan.