Salta al contenuto
Guida di Varlig
Pagina iniziale di Varlig

Liste e statistica

Una lista raccoglie più valori sotto un unico nome: i passi di una settimana, i voti degli esami o gli importi degli scontrini di un mese. Puoi poi sommarli, calcolarne la media, misurarne la dispersione e selezionare quelli che ti interessano.

Questa pagina spiega come scrivere liste e accedere agli elementi tramite indice, calcolare statistiche, sommare le righe precedenti, classificarle con tag per sommarle ovunque si trovino, ordinare ed estrarre porzioni di liste, trasformarle con map e filter ed eseguire operazioni su liste intere. È utile ogni volta che devi riassumere una serie di numeri. Le liste di righe possono anche rappresentare matrici, descritte in una pagina dedicata.

Scrivere una lista

Metti i valori tra parentesi quadre, separati da virgole:

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

La posizione di un valore nella lista è il suo indice, scritto tra parentesi quadre dopo la lista. Gli indici partono da zero: scores[0] è il primo voto e scores[4] il quinto. L’ultimo elemento si trova sempre all’indice length(scores) - 1. Un indice negativo, frazionario o troppo grande genera un errore: gli indici non ripartono dalla fine.

Gli elementi possono essere calcoli, quantità con unità o altri elenchi:

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

Con gli elenchi nidificati, il primo indice sceglie l'elenco interno e il secondo sceglie un valore da esso: [1] seleziona [3, 4], quindi [0] seleziona 3.

I separatori delle migliaia funzionano anche dentro una lista, così puoi incollare gli importi così come sono scritti. Inserisci uno spazio dopo ogni virgola che separa valori diversi: una virgola seguita da tre cifre rimane parte del numero.

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

Alcune cose a cui fare attenzione:

  • Senza spazi, ogni virgola separa i valori: [8200,10400] contiene quindi due elementi. Una lista come [100,200,300] può indicare un solo numero o tre: Varlig mostra un errore che chiarisce entrambe le interpretazioni.
  • I risultati mostrano i separatori delle migliaia e uno spazio dopo ogni virgola tra elementi: [8,200, 10,400] è quindi una lista di due valori.
  • Una lista contiene al massimo 1.024 valori.

Statistiche riassuntive

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

mean e avg sono sinonimi di average, total di sum, stdev di stddev e count di length: puoi quindi usare i nomi familiari dei fogli di calcolo. product moltiplica tutti i valori tra loro. Per il valore più frequente, i percentili o i quartili, vedi sotto.

Se la lista ha un nome, puoi esprimere la statistica anche a parole:

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

sum of, mean of, median of, min of, max of e count of funzionano allo stesso modo. Dopo of, scrivi un nome oppure i valori separati da virgole, con o senza parentesi tonde. Per valori tra parentesi quadre, usa la chiamata di funzione, come average([72, 85, 91]).

La maggior parte delle statistiche, tra cui sum, product, average, median, min, max, count e stddev, accettano anche valori separati invece di una lista:

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

Sommando le righe sopra

Una riga con soltanto sum, total, subtotal, grand total, average, max o min calcola la relativa statistica sui risultati precedenti. Considera la propria sezione, che inizia dopo il totale precedente, un separatore --- o un titolo #: ogni parte della nota ottiene così il proprio risultato mentre scrivi. Funziona come Subtotal nel menu contestuale di una riga:

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

Puoi accompagnare la parola con un’etichetta, assegnare un nome al risultato, convertirlo o aggiungere un commento dopo, mantenendo la riga leggibile come il resto della nota:

calc
tickets = £64
train = £41.20
Estimated total: total dà £105.20

est = total salva il risultato con un nome e total // still to book aggiunge un commento. total in kg converte il risultato prima di visualizzarlo, utile se la sezione combina grammi e chilogrammi. Una parola statistica accanto a un operatore rappresenta lo stesso risultato che produrrebbe su una riga autonoma: £5 + subtotal aggiunge quindi cinque sterline al totale progressivo.

calc
# Parcels
12 kg dà 12 kg
4 kg dà 4 kg
850 g dà 850 g
total in kg dà 16.85 kg
max dà 12 kg

Se hai assegnato a un valore il nome sum o total, la riga mostra quel valore. Se non ci sono importi precedenti da usare, mostra Unsupported: no amounts above to add up invece di una riga vuota o di zero. Spesso la causa è un titolo di sezione che avevi dimenticato.

Ogni importo viene contato una sola volta. Se una riga successiva della sezione calcola un risultato da un importo con un nome, il totale include quel risultato senza contare anche l’importo di partenza. Una lista della spesa con prezzi unitari e quantità dà così il totale effettivamente da pagare:

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

shirt e shorts vengono conteggiati nelle due righe che li usano, mentre fee rimane nel totale perché vat ne calcola soltanto una quota.

La regola segue l’intera catena di nomi. Se la nota divide un importo in quote e poi somma nuovamente queste quote, vengono conteggiati sia la riga che le somma sia l’importo originale:

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

Vengono sommati solo importi compatibili. Se sopra ci sono importi monetari o quantità con unità, percentuali, rapporti e semplici conteggi vengono esclusi, così come le righe con errori. I numeri senza unità incollati in colonna vengono inclusi se sono scritti con la precisione dei centesimi, come gli importi monetari; quelli con più decimali, per esempio tassi di cambio o fattori, vengono esclusi. Il suggerimento del totale elenca le esclusioni, per esempio «Riga 3 esclusa (people = 2)» o «Riga 2 esclusa (errore)», così puoi verificare subito cosa comprende.

Una sequenza di almeno due importi senza nome, immediatamente sopra il totale e sotto una riga calcolata da valori con un nome, viene sommata da sola. In questo modo il budget calcolato all’inizio della nota non viene contato nuovamente nell’elenco sottostante:

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

Per sommare righe non consecutive, assegnagli invece un tag.

Valori più frequenti

mode restituisce il valore più frequente; modes restituisce una lista di tutti i valori che condividono la frequenza massima:

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

mode restituisce un risultato solo se un unico valore è strettamente più frequente degli altri. Se nessun valore si ripete o più valori hanno la stessa frequenza massima, lo segnala senza sceglierne uno arbitrariamente.

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

Percentili e quartili

percentile(list, rank) accetta un rango da 0 a 100 e restituisce il valore in quella posizione, interpolando tra le due osservazioni più vicine. quartile(list, k) esegue lo stesso calcolo per i quartili, con k da 0 a 4: quartile(list, 1) equivale a percentile(list, 25).

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

Il 50° percentile è la mediana; lo 0° e il 100°, cioè quartile(list, 0) e quartile(list, 4), sono il minimo e il massimo, come min e max. Un rango fuori dall’intervallo ammesso genera un errore, senza essere ricondotto al limite più vicino.

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

Dispersione: varianza e deviazione standard

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

Entrambe sono statistiche campionarie: dividono per il numero di valori meno uno (n - 1), la scelta consueta quando i dati rappresentano un campione di una popolazione più ampia. Richiedono almeno due valori. Aggiungi to 1 dp dopo una statistica per arrotondarla.

Se la lista rappresenta l’intera popolazione, usa le forme per la popolazione, che dividono per n e richiedono almeno un valore:

calc
# Train delays in minutes
delays = [2, 4, 4, 4, 5, 5, 7, 9]
sample_variance(delays) dà 4.5714285714
population_variance(delays) dà 4
sample_stddev(delays) dà 2.1380899353
population_stddev(delays) dà 2
Chiamata Divide le differenze al quadrato per Requisiti
variance, sample_variance n - 1 Due valori
population_variance n Un valore
stddev, stdev, sample_stddev n - 1 Due valori
population_stddev n Un valore

sample_variance e sample_stddev sono nomi espliciti per variance e stddev. I nomi brevi hanno sempre indicato le forme campionarie e continuano a farlo.

Elenchi con unità

sum, average, median, mode, modes, percentile, quartile, min, max, stddev e population_stddev conservano le unità e convertono quelle compatibili. Tutti i valori vengono espressi nell’unità del primo elemento, che è anche quella del risultato:

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

Le varianze fanno eccezione: elevano al quadrato le osservazioni e non conservano le unità, quindi accettano soltanto numeri senza unità.

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

Anche sort funziona soltanto con numeri senza unità. Una statistica su valori con unità incompatibili, come sum([1 kg, 3 m]), genera un errore invece di ignorare alcuni valori.

Le regole di esattezza sono descritte in Garanzie del motore di calcolo.

Liste vuote

Chiamata su una lista vuota Risultato
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) Errore
variance([]), stddev([]) Errore

Una lista vuota deriva spesso da un filter che non trova corrispondenze: average su una lista filtrata può quindi fallire anche se la lista originale contiene valori.

Tag

Un tag è un # seguito immediatamente da una parola, come #food. Scrivilo in qualsiasi punto di una riga per classificarla. Il tag non partecipa al calcolo: la riga conserva il proprio risultato e viene raggruppata con le altre righe che hanno lo stesso tag. total of #food somma queste righe:

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

Con i tag puoi fare ciò che un subtotale non permette: sommare righe non consecutive. Spese settimanali, viaggio e lista della spesa possono stare nello stesso blocco, ciascuno con il proprio totale in fondo. Passa il puntatore su un tag per vedere il totale raggiunto fino a quel punto.

Le statistiche funzionano anche sui tag. of è facoltativo e il tag può precedere o seguire la parola statistica. Come per ogni altra riga, puoi aggiungere un’etichetta o assegnare un nome al risultato:

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

sum, total, average, avg, mean, count, min e max supportano tutti questa forma.

Una statistica su un tag può essere usata come un qualsiasi importo in un calcolo. Puoi quindi sottrarre un acconto dal totale progressivo, moltiplicare il totale per un fattore o confrontare due tag:

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

Una riga può avere tutti i tag che vuoi e viene conteggiata da ciascuno. Specificando due tag nella stessa espressione, ottieni solo le righe che li hanno entrambi:

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

Quali righe comprende un totale per tag

Un’espressione con tag considera le stesse righe di un semplice total e segue le stesse regole:

  • Considera la propria sezione, fino al totale precedente, a un separatore --- o a un titolo #.
  • Somma solo importi compatibili. Esclude percentuali, rapporti, conteggi senza unità e righe con errori; il suggerimento li elenca, per esempio «Riga 2 esclusa (people = 2)».
  • Ogni importo viene contato una volta, quindi un prezzo taggato che una riga taggata successiva moltiplica viene contato in quella riga piuttosto che in entrambe.

Basta quindi un titolo di sezione per tenere separato il totale #food di una settimana da quello della successiva:

calc
# Week 1
£20 lunch #food dà £20.00
total of #food dà £20.00
# Week 2
£30 lunch #food dà £30.00
total of #food dà £30.00

Se non ci sono importi da sommare, la riga lo segnala invece di mostrare zero o rimanere vuota. Di solito la causa è un errore nel tag o un titolo di sezione che avevi dimenticato:

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

Scrivere i nomi dei tag

Un nome di tag può contenere lettere, cifre, _, - e /, quindi #q1-2026 e #trip/lisbon sono ciascuno un nome. Le maiuscole non fanno differenza:

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

Un # non unito a una parola conserva il significato abituale, senza cambiare il comportamento delle espressioni già scritte:

Tu scrivi Cos'è
# Weekly shop Un commento, a causa dello spazio dopo l'hash
5 + 5 # comment Lo stesso: tutto dopo l'hash viene ignorato
C#4 in Hz Un diesis musicale, perché il cancelletto è unito alla nota
#1, Invoice #123 Un numero, non un tag: il nome di un tag non può iniziare con una cifra
#ff0000, #fff Un codice colore
varlig.app/docs#tags Un indirizzo web con un frammento

Il nome di un tag deve iniziare con una lettera. Tre, quattro, sei o otto cifre esadecimali dopo il cancelletto vengono interpretate come un colore: #fee è quindi un colore, mentre #fees è un tag.

Tag in una nota e tag in un blocco

I tag che organizzano le note nella barra laterale sono descritti in Tag, collegamenti e backlink. Non si applicano al contenuto dei blocchi di calcolo: un #food dentro un blocco classifica soltanto quella riga per i totali e non compare nella barra laterale. Un #food nel testo esterno al blocco organizza invece la nota senza modificare i calcoli. Scrivilo in entrambi i punti per ottenere entrambi gli effetti. C’è anche una differenza di sintassi: un tag nella nota può contenere spazi se viene chiuso con un secondo #; dentro un blocco di calcolo termina sempre al primo spazio.

Riferimento elenco

Chiamata Cosa fa
range(start,end) Numeri interi da start a end, estremi inclusi
range(start,end,step) Conta per step, che può essere negativo o frazionario ma non zero
length(list), count(list) Numero di valori
sort(list) Dal più piccolo al più grande; solo numeri senza unità
reverse(list) Gli stessi valori in ordine inverso; qualsiasi valore
unique(list) Conserva la prima occorrenza di ogni valore
slice(list,start,end) Valori dall'indice start fino a, ma non incluso, indice end
map(expression,variable,list) Calcola l'espressione una volta per ogni valore
filter(condition,variable,list) Mantieni i valori per i quali la condizione è true
calc
range(1, 5) dà [1, 2, 3, 4, 5]
range(0, 100, 25) dà [0, 25, 50, 75, 100]
range(10, 0, -2) dà [10, 8, 6, 4, 2, 0]
scores = [72, 85, 91, 64, 88]
sort(scores) dà [64, 72, 85, 88, 91]
reverse(sort(scores)) dà [91, 88, 85, 72, 64]
slice(sort(scores), 0, 3) dà [64, 72, 85]
unique([4, 2, 4, 6, 2]) dà [4, 2, 6]

reverse(sort(…)) ordina dal valore maggiore al minore; slice(sort(…), 0, 3) estrae i tre valori più piccoli.

Gli estremi della porzione devono rispettare 0 <= start <= end <= length. Se start ed end coincidono, il risultato è una lista vuota. La forma abbreviata scores[0:2] non è supportata: usa slice(scores, 0, 2).

unique confronta i valori esattamente come sono memorizzati, quindi 1 kg e 1000 g contano come due valori diversi e due risultati che differiscono nella decima cifra decimale non vengono uniti.

Mappa e filtro

map calcola un’espressione per ogni valore della lista. filter conserva solo i valori che soddisfano una condizione. In entrambe, gli argomenti sono l’espressione, un nome che rappresenta ciascun valore e infine la lista:

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

filter(s >= 80, s, scores) significa «i valori s di scores per cui s >= 80». Entrambe le funzioni supportano unità e importi monetari:

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

Il nome che scegli esiste solo all'interno della chiamata. Non cambia un valore con lo stesso nome altrove nella nota:

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

La condizione in filter deve essere un confronto o un altro valore vero/falso. Un numero semplice non è trattato come vero, quindi filter(x, x, [0, 1, 2]) è un errore. La mappatura o il filtraggio di un elenco vuoto dà un elenco vuoto.

Aritmetica sulle liste

Puoi moltiplicare o dividere ogni valore per un singolo numero e aggiungere o sottrarre due elenchi della stessa lunghezza valore per valore:

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

La prima riga converte in percentuali voti espressi in quarantesimi. La riga finals - mocks sottrae, per ogni studente, il voto della simulazione da quello dell’esame finale.

Alcune operazioni non sono supportate sugli elenchi:

  • Aggiungere un singolo numero a una lista, come scores + 5. Usa invece map(s + 5, s, scores).
  • Aggiunta di elenchi di diverse lunghezze. I valori non vengono mai ripetuti per far corrispondere le lunghezze.
  • Moltiplicare due liste semplici con *. Per la somma dei prodotti elemento per elemento usa dot: dot([2, 3, 1], [4, 5, 10]) vale 33, per esempio due caffè da 4, tre tè da 5 e una torta da 10. Tra liste di righe, * esegue invece la moltiplicazione tra matrici, descritta in Vettori e matrici.

Elenchi di righe

Una lista di righe funziona come una piccola tabella. average e sum operano sulle colonne, mentre map può operare sulle righe:

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

median, min, max e stddev non accettano liste di righe. Usa map per elaborare le singole righe, come nell’ultimo esempio, oppure estrai una colonna in una lista separata.

Le regole precise di queste operazioni sono nella documentazione di riferimento sulla matematica avanzata.

Un esempio completo

Ecco i passi registrati da un orologio in una settimana, con un obiettivo giornaliero:

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

La media coincide esattamente con l’obiettivo, ma soltanto quattro giorni lo hanno raggiunto. Tra il giorno migliore e quello peggiore ci sono 5.700 passi di differenza. Modifica goal o incolla i conteggi della settimana successiva: tutte le righe si aggiornano.