Saltar al contenido
Guía de Varlig
Inicio de Varlig

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:

calc
notas = [72, 85, 91, 64, 88] da [72, 85, 91, 64, 88]
notas[0] da 72
notas[4] da 88
length(notas) da 5

La 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:

calc
[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 3

Con 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:

calc
sueldos = [32,000 , 41,500 , 38,250 ] da [€32,000.00, €41,500.00, €38,250.00]
average(sueldos) da €37,250.00

Ten 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

calc
notas = [72, 85, 91, 64, 88]
sum(notas) da 400
average(notas) da 80
median(notas) da 85
min(notas) da 64
max(notas) da 91
count(notas) da 5

mean 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:

calc
notas = [72, 85, 91, 64, 88]
average of notas da 80
total of notas da 400

sum 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:

calc
max(72, 85, 91) da 91
average of 70, 85, 91 da 82
mean of (1,2,3) da 2
average(1,200, 1,800) da 1,500

Sumar 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:

calc
# Compra
pan = 1.20
leche = 1.45
huevos = 2.30
total da €4.95
# Hogar
bolsas de basura = 3.50
lavavajillas = 1.80
total da €5.30

Si has dado a un valor el nombre sum o total, la línea muestra tu valor.

Dispersión: varianza y desviación típica

calc
notas = [72, 85, 91, 64, 88]
variance(notas) da 132.5
stddev(notas) to 1 dp da 11.5

Ambas 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:

calc
# Retrasos de trenes en minutos
retrasos = [2, 4, 4, 4, 5, 5, 7, 9]
stddev(retrasos) da 2.1380899353
centro = average(retrasos) da 5
sqrt(sum(map((x - centro)^2, x, retrasos)) / count(retrasos)) da 2

Listas con unidades

sum, average, median, min, max y stddev conservan las unidades y convierten entre unidades compatibles:

calc
trayectos = [24 min, 31 min, 27 min, 22 min]
sum(trayectos) da 104 min
average(trayectos) da 26 min
median(trayectos) da 25.5 min
sum([1 kg, 500 g]) da 1.5 kg

variance 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
calc
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:

calc
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 3
average(filter(s >= 80, s, notas)) da 88

Lee filter(s >= 80, s, notas) como “los valores s de notas para los que s >= 80”. Ambos funcionan con unidades y dinero:

calc
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.50

El nombre que elijas solo existe dentro de la llamada. No cambia un valor con el mismo nombre en otra parte de la nota:

calc
x = 10
map(x * 2, x, [1, 2, 3]) da [2, 4, 6]
x da 10

La 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:

calc
[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 true

La 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. Usa map(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, usa dot: dot([2, 3, 1], [4, 5, 10]) es 33, 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:

calc
# 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:

calc
# Pasos, de lunes a domingo
pasos = [8200, 10400, 6300, 12000, 9100, 7400, 9600]
objetivo = 9000
sum(pasos) da 63,000
average(pasos) da 9,000
median(pasos) da 9,100
Días con el objetivo cumplido: count(filter(s >= objetivo, s, pasos)) da 4
Diferencia: max(pasos) - min(pasos) da 5,700
# Unos 0.75 m por paso
recorrido = sum(pasos) * 0.75 m
recorrido in km da 47.25 km

La 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.