Pular para o conteúdo
Guia do Varlig
Página inicial do Varlig

Listas e estatística

Uma lista reúne vários valores sob um único nome: passos dados em uma semana, notas de provas ou recibos de um mês. Com os valores em uma lista, você pode somá-los, calcular a média, medir sua dispersão e selecionar os que interessam.

Esta página abrange listas de escrita e indexação, estatísticas resumidas, adição das linhas acima, rotulagem de linhas com tags para que você possa totalizá-las onde quer que estejam, classificação e fatiamento, transformação de uma lista com map e filter e aritmética em listas inteiras. Use esta página sempre que tiver uma coluna de figuras para resumir. Listas de linhas também podem atuar como matrizes, que têm sua própria página.

Escrevendo uma lista

Coloque os valores entre colchetes, separados por vírgulas:

calc
scores = [72, 85, 91, 64, 88] resulta em [72, 85, 91, 64, 88]
scores[0] resulta em 72
scores[4] resulta em 88
length(scores) resulta em 5

A posição de um valor na lista é seu índice, escrito entre colchetes depois da lista. Os índices começam em zero: scores[0] é a primeira nota, e scores[4], a quinta. O último elemento fica sempre em length(scores) - 1. Índices negativos, fracionários ou acima do limite produzem erro; eles não contam a partir do fim nem reiniciam no começo.

Elementos podem ser cálculos, quantidades com unidades ou outras listas:

calc
[2 * 45, 60 + 15] resulta em [90, 75]
[1.5 kg, 750 g] resulta em [1.5 kg, 750 g]
[[1, 2], [3, 4]][1][0] resulta em 3

Com listas aninhadas, o primeiro índice escolhe a lista interna e o segundo escolhe um valor a partir dela: [1] seleciona [3, 4], então [0] seleciona 3.

Separadores de milhar funcionam dentro de listas, permitindo colar os números como estão escritos. Coloque um espaço após cada vírgula que separa valores. Uma vírgula seguida de três dígitos continua fazendo parte do número:

calc
salaries = [£32,000, £41,500, £38,250] resulta em [£32,000.00, £41,500.00, £38,250.00]
average(salaries) resulta em £37,250.00

Algumas coisas para observar:

  • Sem espaços, cada vírgula separa valores; por isso, [8200,10400] tem dois elementos. Já [100,200,300] pode representar um número ou três. Nesse caso, Varlig mostra um erro explicando as duas interpretações.
  • As respostas usam separadores de milhar e um espaço após cada vírgula entre elementos. Assim, [8,200, 10,400] é uma lista de dois valores.
  • Uma lista contém no máximo 1.024 valores.

Estatísticas resumidas

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

mean e avg são outros nomes para average, total para sum, stdev para stddev e count para length, então os hábitos da planilha são transferidos. o product multiplica os valores juntos. Para o valor mais comum, um percentil ou um quartil, veja abaixo.

Com uma lista nomeada, você também pode escrever a estatística em palavras:

calc
scores = [72, 85, 91, 64, 88]
average of scores resulta em 80
total of scores resulta em 400

sum of, mean of, median of, min of, max of e count of funcionam da mesma forma. Depois de of, escreva um nome ou os próprios valores separados por vírgulas, com ou sem parênteses. Para valores entre colchetes, use a forma de função, como em average([72, 85, 91]).

A maioria das estatísticas, incluindo sum, product, average, median, min, max, count e stddev, também aceitam valores separados em vez de uma lista:

calc
max(72, 85, 91) resulta em 91
sum(1, 2, 3, 4) resulta em 10
average of 70, 85, 91 resulta em 82
mean of (1,2,3) resulta em 2
average(1,200, 1,800) resulta em 1,500

Somar as linhas acima

Uma linha contendo apenas sum, total, subtotal, grand total, average, max ou min calcula a estatística correspondente das respostas acima. Ela considera sua própria seção, iniciada no total anterior, em um separador --- ou em um título #. Assim, cada parte da nota recebe seu resultado enquanto você escreve. O comportamento é o mesmo da opção Subtotal no menu de contexto da linha:

calc
# Groceries
bread = £1.20
milk = £1.45
eggs = £2.30
total resulta em £4.95
# Household
bin bags = £3.50
washing up liquid = £1.80
total resulta em £5.30

A palavra pode ter um rótulo, tomar um nome próprio, converter a resposta ou ter um comentário depois dela, então a linha parece o resto da sua nota:

calc
tickets = £64
train = £41.20
Estimated total: total resulta em £105.20

est = total armazena o resultado em um nome, e total // still to book acrescenta um comentário ao lado. total in kg converte antes de exibir, o que é útil em uma seção com gramas e quilogramas. Uma palavra de estatística junto de um operador representa o resultado que teria em sua própria linha: £5 + subtotal acrescenta cinco libras ao subtotal.

calc
# Parcels
12 kg resulta em 12 kg
4 kg resulta em 4 kg
850 g resulta em 850 g
total in kg resulta em 16.85 kg
max resulta em 12 kg

Se você deu a um valor o nome sum ou total, a linha mostra seu valor em vez disso. Quando não há nada acima para trabalhar, a linha diz Unsupported: no amounts above to add up vez de mostrar um espaço em branco ou um zero, o que geralmente significa que um título que você esqueceu que estava lá.

Cada valor é contado uma vez. Quando uma linha posterior na seção trabalha algo a partir de uma quantidade nomeada, o total conta essa linha em vez de ambas, portanto, uma lista de compras de preços unitários e quantidades soma o que você realmente pagará:

calc
shirt = £18.50
shorts = £9
9 * shirt resulta em £166.50
10 * shorts resulta em £90.00
fee = £40
vat = fee * 20% resulta em £8.00
total resulta em £304.50

shirt e shorts são contados dentro das duas linhas que os usam, enquanto fee permanece no total porque vat leva apenas uma parte dele.

Essa regra acompanha toda a cadeia de nomes. Quando a nota divide um valor em partes e depois soma essas partes, entram no total tanto a linha que as soma quanto o valor original do qual elas foram calculadas:

calc
pot = £900
1st = 50% of pot resulta em £450.00
2nd = 30% of pot resulta em £270.00
3rd = 20% of pot resulta em £180.00
1st + 2nd + 3rd resulta em £900.00
total resulta em £900.00

Somente valores compatíveis são somados. Se houver valores monetários ou quantidades com unidades acima, porcentagens, taxas e contagens simples ficam de fora, assim como linhas com erro. Números sem unidades colados em uma coluna entram na soma quando escritos com precisão de centavos, como os demais valores monetários. Valores com mais casas decimais, como taxas de câmbio ou fatores, são excluídos. A dica do total informa tudo o que ficou de fora, por exemplo: "Exclui a linha 3 (people = 2)" ou "Exclui a linha 2 (erro)", permitindo conferir o que compõe o resultado.

Uma lista de dois ou mais valores escritos sem nomes, diretamente acima do total e abaixo de uma linha trabalhada a partir de nomes, é adicionada por conta própria. Dessa forma, um orçamento trabalhado no topo de uma nota não é contado novamente na lista abaixo:

calc
budget = £18,000
remaining = budget - £6,388.25 resulta em £11,611.75
- skip hire £250 resulta em £250.00
- deep clean £120 resulta em £120.00
subtotal resulta em £370.00

Para totalizar linhas que não estão próximas uma da outra, rotule-as com uma tag.

Valores mais comuns

mode retorna o valor mais frequente; modes retorna uma lista com todos os valores empatados na maior frequência:

calc
marks = [3, 4, 4, 5, 5, 5, 6]
mode(marks) resulta em 5
modes([1, 1, 2, 2, 3]) resulta em [1, 2]

mode responde apenas quando um valor é estritamente o mais comum. Se nada se repetir, ou vários valores empatados, ele diz isso em vez de escolher um:

calc
mode([1, 2, 3]) resulta em Unsupported: No value repeats, so this list has no mode; use median or average instead

Percentis e quartis

percentile(list, rank) recebe uma posição de 0 a 100 e retorna o valor correspondente, interpolando entre as duas observações mais próximas. quartile(list, k) faz o mesmo em quartos, com k de 0 a 4: quartile(list, 1) equivale a percentile(list, 25):

calc
scores = [72, 85, 91, 64, 88]
percentile(scores, 50) resulta em 85
percentile(scores, 25) resulta em 72
quartile(scores, 3) resulta em 88
quartile(scores, 4) resulta em 91
percentile([1, 2, 3, 4], 25) resulta em 1.75
quartile([1, 2, 3, 4], 3) resulta em 3.25

O percentil 50 é a mediana, e o 0o e o 100o — quartile(list, 0) e quartile(list, 4) — são os menores e maiores valores, o mesmo que min e max. Uma classificação fora de seu intervalo é um erro, em vez do valor mais próximo que se encaixaria:

calc
percentile([1, 2, 3, 4], 101) resulta em Unsupported: A percentile is between 0 and 100
quartile([1, 2, 3, 4], 5) resulta em Unsupported: A quartile is 0, 1, 2, 3 or 4

Dispersão: variância e desvio padrão

calc
scores = [72, 85, 91, 64, 88]
variance(scores) resulta em 132.5
stddev(scores) to 1 dp resulta em 11.5

Ambas são estatísticas amostrais: dividem pelo número de valores menos um (n - 1), a escolha usual quando os dados são uma amostra de um conjunto maior. Elas exigem pelo menos dois valores. Acrescente to 1 dp depois de qualquer estatística para arredondá-la.

Quando a lista representa toda a população, não uma amostra, use as versões populacionais, que dividem por n e exigem apenas um valor:

calc
# Train delays in minutes
delays = [2, 4, 4, 4, 5, 5, 7, 9]
sample_variance(delays) resulta em 4.5714285714
population_variance(delays) resulta em 4
sample_stddev(delays) resulta em 2.1380899353
population_stddev(delays) resulta em 2
Chamada Divide as diferenças ao quadrado por Requer
variance, sample_variance n - 1 Dois valores
population_variance n Um valor
stddev, stdev, sample_stddev n - 1 Dois valores
population_stddev n Um valor

sample_variance e sample_stddev são nomes mais longos para variance e stddev, para que você possa soletrar qual você quer dizer. Os nomes curtos sempre foram as formas de amostra e ainda são.

Listas com unidades

sum, average, median, mode, modes, percentile, quartile, min, max, stddev e population_stddev mantêm unidades e convertem entre as compatíveis. Os valores são lidos na unidade do primeiro, e a resposta volta nela:

calc
commutes = [24 min, 31 min, 27 min, 22 min]
sum(commutes) resulta em 1 hour 44 min
average(commutes) resulta em 26 min
median(commutes) resulta em 25.5 min
percentile(commutes, 25) resulta em 23.5 min
population_stddev(commutes) resulta em 3.3911649916 min
sum([1 kg, 500 g]) resulta em 1.5 kg
modes([1 kg, 500 g, 1 kg, 500 g]) resulta em [0.5 kg, 1 kg]

As variâncias são a exceção: elevam as observações ao quadrado, e Varlig não preserva unidades nessa operação. Por isso, essas funções aceitam apenas números sem unidades.

calc
sample_variance([1 kg, 2 kg]) resulta em Unsupported: A variance squares its observations, so it takes plain numbers; use stddev for amounts with a unit

sort também só funciona em números simples. Uma estatística sobre valores com unidades incompatíveis, como sum([1 kg, 3 m]), dá um erro em vez de pular valores silenciosamente.

As regras de exatidão por trás de tudo isso estão em O que o motor garante.

Listas vazias

Chamada com uma lista vazia Resultado
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) Erro
variance([]), stddev([]) Erro

Uma lista vazia geralmente aparece como resultado de um filter que não corresponde a nada, portanto, uma average de uma lista filtrada pode falhar mesmo quando a lista original tem valores.

Tags

Uma tag é um # com uma palavra unida diretamente a ela, como #food. Escreva um em qualquer lugar de uma linha para rotular essa linha. A tag não participa da soma, então a linha ainda mostra sua própria resposta, e agrupa essa linha com todas as outras linhas que carregam a mesma tag. total of #food então adiciona essas linhas:

calc
£12.50 lunch #food resulta em £12.50
£8 coffee #food resulta em £8.00
flights = £420 #trip resulta em £420.00
total of #food resulta em £20.50

Isso é o que uma tag lhe dá que um subtotal não pode: as linhas não precisam ficar uma ao lado da outra. Uma semana de gastos, uma viagem e uma lista de compras podem compartilhar um bloco, cada um com sua própria figura na parte inferior. Mantenha o ponteiro sobre uma tag para ver o que ela se soma até agora.

Toda estatística funciona em uma tag. of é opcional, a tag pode vir antes ou depois da palavra, e a resposta leva um rótulo ou um nome próprio, como qualquer outra linha:

calc
#food £12.50
#food £8
£420 #trip
total of #food resulta em £20.50
average of #food resulta em £10.25
count of #food resulta em 2
min of #food resulta em £8.00
max of #food resulta em £12.50
#food total resulta em £20.50
Food this week: sum of #food resulta em £20.50
eaten = avg #food resulta em £10.25

sum, total, average, avg, mean, count, min e max, todos lidos desta forma.

Uma estatística por tag pode aparecer no lugar de um valor, permitindo continuar o cálculo a partir dela. Assim, você pode subtrair uma entrada de um total acumulado, multiplicar um total por um fator ou comparar os totais de duas tags:

calc
£20 shop #food resulta em £20.00
£30 meal out #food resulta em £30.00
total of #food - £10 resulta em £40.00
2 * total of #food resulta em £100.00
Cooking kit: total of #food resulta em £50.00

Uma linha pode carregar quantas tags você quiser, e cada uma conta. Nomeie duas tags em uma frase e você obterá as linhas que carregam ambas:

calc
£50 dinner #trip #food resulta em £50.00
£30 taxi #trip resulta em £30.00
£9 sandwich #food resulta em £9.00
total of #trip resulta em £80.00
total of #food resulta em £59.00
total of #trip #food resulta em £50.00

O que o total de uma tag inclui

Uma frase de tag analisa exatamente as mesmas linhas que um total simples e segue as mesmas regras:

  • Abrange sua própria seção, de volta ao total anterior, um divisor --- ou um título #.
  • São somados apenas valores compatíveis. Porcentagens, taxas, contagens simples e linhas com erro ficam de fora. A dica informa quais foram excluídos, como em "Exclui a linha 2 (people = 2)".
  • Cada quantidade é contada uma vez, portanto, um preço marcado que uma linha marcada posterior multiplica é contado nessa linha e não em ambas.

Portanto, um título é tudo o que é necessário para manter o #food de uma semana separado da próxima:

calc
# Week 1
£20 lunch #food resulta em £20.00
total of #food resulta em £20.00
# Week 2
£30 lunch #food resulta em £30.00
total of #food resulta em £30.00

Quando não há nada para somar, a linha diz isso em vez de mostrar um espaço em branco ou um zero, o que geralmente significa um erro de digitação na tag ou um título que você esqueceu que estava lá:

calc
£12.50 lunch #food resulta em £12.50
total of #drinks resulta em Unsupported: no lines tagged #drinks above
ring the plumber #jobs
total of #jobs resulta em Unsupported: no amounts tagged #jobs above

Como escrever nomes de tags

Um nome de tag pode conter letras, dígitos, _, - e /, então #q1-2026 e #trip/lisbon são um nome cada. As maiúsculas não fazem diferença:

calc
£20 flight #trip/lisbon resulta em £20.00
£35 hotel #Trip/Lisbon resulta em £35.00
total of #trip/lisbon resulta em £55.00

Um # que não está unido a uma palavra mantém seu significado antigo, então nada que você já escreve muda:

Você escreve O que é
# Weekly shop Um comentário, por causa do espaço após o hash
5 + 5 # comment O mesmo: tudo depois do hash é ignorado
C#4 in Hz Um sustenido musical, pois o sinal de cerquilha está junto da nota
#1, Invoice #123 Um número, não uma tag: o nome de uma tag não pode começar com um dígito
#ff0000, #fff Um código de cores
varlig.app/docs#tags Um endereço da web com um fragmento

O nome de uma tag precisa começar com uma letra. Três, quatro, seis ou oito dígitos hexadecimais depois de # são interpretados como uma cor: por isso, #fee é uma cor, enquanto #fees é uma tag.

Tags em uma nota e tags em um bloco

As tags que organizam notas na barra lateral são explicadas em Tags, links e backlinks. Elas não entram nos blocos de cálculo: #food dentro de um bloco identifica a linha para os totais e nunca aparece na barra lateral; #food no texto ao redor do bloco organiza a nota sem afetar os cálculos. Escreva a tag nos dois lugares se quiser ambos os efeitos. Há uma diferença de sintaxe: uma tag no texto da nota pode conter espaços se terminar com outro #; dentro de um bloco de cálculo, a tag sempre termina no primeiro espaço.

Referência da lista

Chamada O que faz
range(start,end) Números inteiros de start a end, incluindo ambas as extremidades
range(start,end,step) Contagem por step, que pode ser negativa ou fracionária, mas não zero
length(list), count(list) Número de valores
sort(list) Menor para maior; apenas números simples
reverse(list) Os mesmos valores em ordem inversa; quaisquer valores
unique(list) Mantenha a primeira ocorrência de cada valor
slice(list,start,end) Valores do índice start até, mas não incluindo, o índice end
map(expression,variable,list) Avalia a expressão uma vez para cada valor
filter(condition,variable,list) Mantenha os valores para os quais a condição é true
calc
range(1, 5) resulta em [1, 2, 3, 4, 5]
range(0, 100, 25) resulta em [0, 25, 50, 75, 100]
range(10, 0, -2) resulta em [10, 8, 6, 4, 2, 0]
scores = [72, 85, 91, 64, 88]
sort(scores) resulta em [64, 72, 85, 88, 91]
reverse(sort(scores)) resulta em [91, 88, 85, 72, 64]
slice(sort(scores), 0, 3) resulta em [64, 72, 85]
unique([4, 2, 4, 6, 2]) resulta em [4, 2, 6]

reverse(sort(…)) dá o maior primeiro, e slice(sort(…), 0, 3) escolhe os três mais baixos.

Os limites de fatia devem satisfazer 0 <= start <= end <= length. start e end iguais dão uma lista vazia. Não há scores[0:2] abreviação; escreva slice(scores, 0, 2)

unique compara valores exatamente como são armazenados, então 1 kg e 1000 g contam como dois valores diferentes, e dois resultados que diferem na décima casa decimal não são mesclados.

Mapeamento e filtragem

map trabalha uma expressão para cada valor em uma lista. filter mantém os valores que passam em um teste. Em ambos, a expressão vem primeiro, depois um nome para cada valor, depois a lista:

calc
scores = [72, 85, 91, 64, 88]
map(s + 5, s, scores) resulta em [77, 90, 96, 69, 93]
filter(s >= 80, s, scores) resulta em [85, 91, 88]
count(filter(s >= 80, s, scores)) resulta em 3
average(filter(s >= 80, s, scores)) resulta em 88

Leia filter(s >= 80, s, scores) como "os valores s em scores onde s >= 80". Ambos trabalham com unidades e dinheiro:

calc
map(p * 1.2, p, [£10, £25, £40]) resulta em [£12.00, £30.00, £48.00]
spend = [£42.50, £18.20, £65.00, £23.30]
filter(x > £30, x, spend) resulta em [£42.50, £65.00]
sum(filter(x > £30, x, spend)) resulta em £107.50

O nome que você escolher só existe dentro da chamada. Não altera um valor com o mesmo nome em outro lugar na nota:

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

A condição em filter deve ser uma comparação ou outro valor verdadeiro/falso. Um número simples não é tratado como verdadeiro, então filter(x, x, [0, 1, 2]) é um erro. Mapear ou filtrar uma lista vazia dá uma lista vazia.

Aritmética com listas

Você pode multiplicar ou dividir cada valor por um único número e adicionar ou subtrair duas listas do mesmo comprimento valor por valor:

calc
[30, 36, 22] / 40 * 100 resulta em [75, 90, 55]
2 * [3, 1, 4] resulta em [6, 2, 8]
-[5, -3] resulta em [-5, 3]
mocks = [62, 70, 60]
finals = [72, 78, 69]
finals - mocks resulta em [10, 8, 9]
average(finals - mocks) resulta em 9
[1 kg, 2 kg] + [500 g, 500 g] resulta em [1.5 kg, 2.5 kg]
[72, 85] == [72, 85] resulta em true

A primeira linha converte notas de uma prova valendo 40 pontos em porcentagens. A linha finals - mocks compara a nota final de cada aluno com a nota do respectivo simulado.

Algumas operações não são suportadas em listas:

  • Adicionando um único número a uma lista, como em scores + 5. Use map(s + 5, s, scores) em vez disso.
  • Adicionando listas de diferentes comprimentos. Os valores nunca são repetidos para fazer com que os comprimentos combinem.
  • Multiplicando duas listas simples com *. Para a soma de produtos em pares, use dot: dot([2, 3, 1], [4, 5, 10]) é 33, por exemplo, dois cafés em 4, três chás em 5 e um bolo em 10. Entre listas de linhas, * é a multiplicação matricial, coberta em Vetores e matrizes.

Listas de linhas

Uma lista de linhas funciona como uma pequena tabela. average e sum funcionam nas colunas, e map pode funcionar nas linhas:

calc
# Each row is one student: [mock, final]
results = [[62, 72], [70, 78], [60, 69]]
average(results) resulta em [64, 73]
sum(results) resulta em [192, 219]
map(average(r), r, results) resulta em [67, 74, 64.5]

median, min, max e stddev não aceitam listas de linhas. Use map sobre as linhas, como na última linha, ou puxe uma coluna para sua própria lista.

As regras exatas para todas essas operações estão na referência matemática avançada.

Combinando os recursos

Aqui está uma semana de contagens de passos de um relógio, com uma meta diária:

calc
# Steps, Monday to Sunday
steps = [8200, 10400, 6300, 12000, 9100, 7400, 9600]
goal = 9000
sum(steps) resulta em 63,000
average(steps) resulta em 9,000
median(steps) resulta em 9,100
Days on target: count(filter(s >= goal, s, steps)) resulta em 4
Spread: max(steps) - min(steps) resulta em 5,700
# Roughly 0.75 m per step
walked = sum(steps) * 0.75 m
walked in km resulta em 47.25 km

A média coincide exatamente com a meta, mas apenas quatro dias a atingiram. A diferença entre o melhor e o pior dia é de 5.700 passos. Altere goal ou cole as contagens da próxima semana para atualizar todas as linhas.