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 sumar las líneas de arriba, cómo marcar líneas con etiquetas para sumarlas estén donde
estén, 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í. Para el valor más frecuente, un percentil o un cuartil, consulta
más abajo.
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 91sum(1, 2, 3, 4) da 10average 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, total, subtotal, grand total, average, max o min
calcula esa cifra a partir de los resultados de arriba. Abarca su propia sección, que empieza en el
total anterior, en un separador --- o en un encabezado #, así que cada parte de una nota tiene su
propia cifra mientras escribes. Funciona como la opción Subtotal del
menú contextual de una línea:
# Comprapan = 1.20 €leche = 1.45 €huevos = 2.30 €total da €4.95# Hogarbolsas de basura = 3.50 €lavavajillas = 1.80 €total da €5.30La palabra admite un texto delante, un nombre propio, una conversión o un comentario detrás, así que la línea se lee como el resto de tu nota:
entradas = 64 €tren = 41.20 €Total estimado: total da €105.20est = total guarda la cifra con un nombre, y total // falta reservar añade una nota al lado.
total in kg convierte antes de mostrar el resultado, algo útil cuando una sección mezcla gramos y
kilogramos. Una palabra de estadística junto a un operador vale lo que mostraría su propia línea, así
que 5 € + subtotal suma cinco euros al total acumulado.
# Paquetes12 kg da 12 kg4 kg da 4 kg850 g da 850 gtotal in kg da 16.85 kgmax da 12 kgSi has dado a un valor el nombre sum o total, la línea muestra tu valor. Cuando no hay nada
arriba con lo que trabajar, la línea dice Unsupported: no amounts above to add up en lugar de
quedarse en blanco o mostrar un cero, lo que suele significar que había un encabezado del que te
habías olvidado.
Cada importe se cuenta una sola vez. Cuando una línea posterior de la sección calcula algo a partir de un importe con nombre, el total cuenta esa línea y no las dos, así que una lista de la compra con precios unitarios y cantidades suma lo que vas a pagar de verdad:
camisa = 18.50 €pantalones = 9 €9 * camisa da €166.5010 * pantalones da €90.00comisión = 40 €iva = comisión * 21% da €8.40total da €304.90camisa y pantalones se cuentan dentro de las dos líneas que los usan, mientras que comisión
sigue en el total porque iva solo toma una parte de ella.
Esto sigue una cadena de nombres hasta donde llegue. Cuando una nota reparte un importe en partes y luego vuelve a sumarlas, cuenta la línea que las suma, y también el importe del que salían:
bote = 900 €primero = 50% of bote da €450.00segundo = 30% of bote da €270.00tercero = 20% of bote da €180.00primero + segundo + tercero da €900.00total da €900.00Solo se suman importes del mismo tipo. Los porcentajes, las tarifas y los recuentos sin más se quedan fuera cuando arriba hay dinero o una cantidad, igual que una línea con un error. Los números sin unidad pegados en una columna sí se suman cuando están escritos al céntimo, como los importes; uno con más decimales, como un tipo de cambio o un factor, se queda fuera. El aviso del total nombra todo lo que ha dejado fuera, por ejemplo “Leaves out line 3 (personas = 2)” o “Leaves out line 2 (an error)”, así que ves de un vistazo qué entra en la cifra.
Una lista de dos o más importes escritos sin nombre, justo encima del total y debajo de una línea calculada a partir de nombres, se suma por su cuenta. Así, un presupuesto calculado al principio de una nota no se vuelve a contar en la lista de abajo:
presupuesto = 18,000 €restante = presupuesto - 6,388.25 € da €11,611.75- contenedor de obra 250 € da €250.00- limpieza a fondo 120 € da €120.00subtotal da €370.00Para sumar líneas que no están juntas, márcalas con una etiqueta.
Valores más frecuentes
mode da el valor que aparece más veces que ningún otro, y modes da todos los valores empatados
como más frecuentes, en una lista:
calificaciones = [3, 4, 4, 5, 5, 5, 6]mode(calificaciones) da 5modes([1, 1, 2, 2, 3]) da [1, 2]mode solo responde cuando un valor es estrictamente el más frecuente. Si no se repite nada, o
varios valores empatan, lo dice en lugar de elegir uno:
mode([1, 2, 3]) da Unsupported: No value repeats, so this list has no mode; use median or average insteadPercentiles y cuartiles
percentile(lista, rango) toma un rango de 0 a 100 y da el valor que hay en ese punto,
interpolando entre las dos observaciones más cercanas. quartile(lista, k) hace lo mismo por
cuartos, con una k de 0 a 4, así que quartile(lista, 1) es percentile(lista, 25):
notas = [72, 85, 91, 64, 88]percentile(notas, 50) da 85percentile(notas, 25) da 72quartile(notas, 3) da 88quartile(notas, 4) da 91percentile([1, 2, 3, 4], 25) da 1.75quartile([1, 2, 3, 4], 3) da 3.25El percentil 50 es la mediana, y el 0 y el 100 —quartile(lista, 0) y quartile(lista, 4)— son el
valor menor y el mayor, igual que min y max. Un rango fuera de su intervalo es un error, en
lugar del valor más cercano que encajaría:
percentile([1, 2, 3, 4], 101) da Unsupported: A percentile is between 0 and 100quartile([1, 2, 3, 4], 5) da Unsupported: A quartile is 0, 1, 2, 3 or 4Dispersió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.
Cuando tu lista es la población completa y no una muestra, usa las formas poblacionales, que
dividen entre n y necesitan un solo valor:
# Retrasos de trenes en minutosretrasos = [2, 4, 4, 4, 5, 5, 7, 9]sample_variance(retrasos) da 4.5714285714population_variance(retrasos) da 4sample_stddev(retrasos) da 2.1380899353population_stddev(retrasos) da 2| Llamada | Divide las diferencias al cuadrado entre | Necesita |
|---|---|---|
variance, sample_variance |
n - 1 |
Dos valores |
population_variance |
n |
Un valor |
stddev, stdev, sample_stddev |
n - 1 |
Dos valores |
population_stddev |
n |
Un valor |
sample_variance y sample_stddev son nombres más largos de variance y stddev, para que puedas
dejar claro cuál quieres. Los nombres cortos siempre han sido las formas muestrales, y lo siguen
siendo.
Listas con unidades
sum, average, median, mode, modes, percentile, quartile, min, max, stddev y
population_stddev conservan las unidades y convierten entre unidades compatibles. Los valores se
leen en la unidad del primero, y el resultado vuelve en esa misma unidad:
trayectos = [24 min, 31 min, 27 min, 22 min]sum(trayectos) da 1 hour 44 minaverage(trayectos) da 26 minmedian(trayectos) da 25.5 minpercentile(trayectos, 25) da 23.5 minpopulation_stddev(trayectos) da 3.3911649916 minsum([1 kg, 500 g]) da 1.5 kgmodes([1 kg, 500 g, 1 kg, 500 g]) da [0.5 kg, 1 kg]Las varianzas son la excepción: elevan al cuadrado sus observaciones, y ninguna unidad sobrevive a eso, así que solo aceptan números sin unidades.
sample_variance([1 kg, 2 kg]) da Unsupported: A variance squares its observations, so it takes plain numbers; use stddev for amounts with a unitsort 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.
Las reglas de exactitud que hay detrás de todo esto están en Qué garantiza el motor.
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.
Etiquetas
Una etiqueta es una # con una palabra pegada justo detrás, como #comida. Escríbela en cualquier
punto de una línea para marcarla. La etiqueta no participa en el cálculo, así que la línea sigue
mostrando su propio resultado, y agrupa esa línea con todas las demás que llevan la misma etiqueta.
total of #comida suma entonces esas líneas:
12.50 € almuerzo #comida da €12.508 € café #comida da €8.00vuelos = 420 € #viaje da €420.00total of #comida da €20.50Eso es lo que te da una etiqueta y un subtotal no: las líneas no tienen que estar juntas. Una semana de gastos, un viaje y una lista de la compra pueden compartir un mismo bloque, cada uno con su cifra al final. Pon el puntero sobre una etiqueta para ver cuánto suma hasta ese momento.
Todas las estadísticas funcionan con una etiqueta. El of es opcional, la etiqueta puede ir antes o
después de la palabra, y el resultado admite un texto delante o un nombre propio, como cualquier otra
línea:
#comida 12.50 €#comida 8 €420 € #viajetotal of #comida da €20.50average of #comida da €10.25count of #comida da 2min of #comida da €8.00max of #comida da €12.50#comida total da €20.50Comida de la semana: sum of #comida da €20.50comido = avg #comida da €10.25sum, total, average, avg, mean, count, min y max se leen todas así.
La estadística de una etiqueta ocupa el lugar de un importe, así que un cálculo puede continuar a partir de ella. Así restas una señal de un total acumulado, lo multiplicas o enfrentas dos etiquetas entre sí:
20 € compra #comida da €20.0030 € cena fuera #comida da €30.00total of #comida - 10 € da €40.002 * total of #comida da €100.00Equipo de cocina: total of #comida da €50.00Una línea puede llevar tantas etiquetas como quieras, y cada una la cuenta. Nombra dos etiquetas en una misma expresión y obtienes las líneas que llevan las dos:
50 € cena #viaje #comida da €50.0030 € taxi #viaje da €30.009 € bocadillo #comida da €9.00total of #viaje da €80.00total of #comida da €59.00total of #viaje #comida da €50.00Qué abarca el total de una etiqueta
Una expresión con etiqueta mira exactamente las mismas líneas que miraría un total normal, y sigue
las mismas reglas:
- Abarca su propia sección, hasta el total anterior, un separador
---o un encabezado#. - Solo suma importes del mismo tipo. Los porcentajes, las tarifas, los recuentos sin más y las líneas con errores se quedan fuera, y el aviso los nombra, por ejemplo “Leaves out line 2 (personas = 2)”.
- Cada importe se cuenta una sola vez, así que un precio etiquetado que una línea etiquetada posterior multiplica se cuenta en esa línea y no en las dos.
Por eso basta con un encabezado para separar la #comida de una semana de la de la siguiente:
# Semana 120 € almuerzo #comida da €20.00total of #comida da €20.00# Semana 230 € almuerzo #comida da €30.00total of #comida da €30.00Cuando no hay nada que sumar, la línea lo dice en lugar de quedarse en blanco o mostrar un cero, lo que suele significar que hay una errata en la etiqueta o un encabezado del que te habías olvidado:
12.50 € almuerzo #comida da €12.50total of #bebidas da Unsupported: no lines tagged #bebidas abovellamar al fontanero #tareastotal of #tareas da Unsupported: no amounts tagged #tareas aboveCómo se escriben los nombres de las etiquetas
El nombre de una etiqueta admite letras, cifras, _, - y /, así que #t1-2026 y
#viaje/lisboa son cada uno un solo nombre. Las mayúsculas no cambian nada:
20 € vuelo #viaje/lisboa da €20.0035 € hotel #Viaje/Lisboa da €35.00total of #viaje/lisboa da €55.00Una # que no va pegada a una palabra conserva su significado de siempre, así que nada de lo que ya
escribes cambia:
| Lo que escribes | Qué es |
|---|---|
# Compra semanal |
Un comentario, por el espacio después de la almohadilla |
5 + 5 # comentario |
Lo mismo: todo lo que va después de la almohadilla se ignora |
C#4 in Hz |
Un sostenido musical, porque la almohadilla va pegada a la nota musical |
#1, Factura #123 |
Un número, no una etiqueta: un nombre de etiqueta no empieza por una cifra |
#ff0000, #fff |
Un código de color |
varlig.app/docs#tags |
Una dirección web con un fragmento |
El nombre de una etiqueta tiene que empezar por una letra, y tres, cuatro, seis u ocho dígitos
hexadecimales después de la almohadilla se leen como un color, así que #cafe es un color y
#cafes es una etiqueta.
Etiquetas en una nota y etiquetas en un bloque
Las etiquetas que organizan tus notas en la barra lateral se explican en
Etiquetas, enlaces y retroenlaces. Esas se detienen en el borde de un bloque
de cálculo: una #comida escrita dentro de un bloque marca esa línea para su total y nunca aparece
en la barra lateral, y una #comida en la nota que rodea al bloque clasifica la nota sin tocar tus
cuentas. Escribe la etiqueta en los dos sitios cuando quieras las dos cosas, y ten en cuenta que se
diferencian en un detalle: la etiqueta de una nota admite espacios si la cierras con una segunda #,
mientras que la de un bloque de cálculo siempre termina en el primer espacio.
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.