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:
scores = [72, 85, 91, 64, 88] dà [72, 85, 91, 64, 88]scores[0] dà 72scores[4] dà 88length(scores) dà 5La 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:
[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à 3Con 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.
salaries = [£32,000, £41,500, £38,250] dà [£32,000.00, £41,500.00, £38,250.00]average(salaries) dà £37,250.00Alcune 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
scores = [72, 85, 91, 64, 88]sum(scores) dà 400average(scores) dà 80median(scores) dà 85min(scores) dà 64max(scores) dà 91count(scores) dà 5mean 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:
scores = [72, 85, 91, 64, 88]average of scores dà 80total of scores dà 400sum 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:
max(72, 85, 91) dà 91sum(1, 2, 3, 4) dà 10average of 70, 85, 91 dà 82mean of (1,2,3) dà 2average(1,200, 1,800) dà 1,500Sommando 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:
# Groceriesbread = £1.20milk = £1.45eggs = £2.30total dà £4.95# Householdbin bags = £3.50washing up liquid = £1.80total dà £5.30Puoi 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:
tickets = £64train = £41.20Estimated total: total dà £105.20est = 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.
# Parcels12 kg dà 12 kg4 kg dà 4 kg850 g dà 850 gtotal in kg dà 16.85 kgmax dà 12 kgSe 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:
shirt = £18.50shorts = £99 * shirt dà £166.5010 * shorts dà £90.00fee = £40vat = fee * 20% dà £8.00total dà £304.50shirt 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:
pot = £9001st = 50% of pot dà £450.002nd = 30% of pot dà £270.003rd = 20% of pot dà £180.001st + 2nd + 3rd dà £900.00total dà £900.00Vengono 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:
budget = £18,000remaining = budget - £6,388.25 dà £11,611.75- skip hire £250 dà £250.00- deep clean £120 dà £120.00subtotal dà £370.00Per 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:
marks = [3, 4, 4, 5, 5, 5, 6]mode(marks) dà 5modes([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.
mode([1, 2, 3]) dà Unsupported: No value repeats, so this list has no mode; use median or average insteadPercentili 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).
scores = [72, 85, 91, 64, 88]percentile(scores, 50) dà 85percentile(scores, 25) dà 72quartile(scores, 3) dà 88quartile(scores, 4) dà 91percentile([1, 2, 3, 4], 25) dà 1.75quartile([1, 2, 3, 4], 3) dà 3.25Il 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.
percentile([1, 2, 3, 4], 101) dà Unsupported: A percentile is between 0 and 100quartile([1, 2, 3, 4], 5) dà Unsupported: A quartile is 0, 1, 2, 3 or 4Dispersione: varianza e deviazione standard
scores = [72, 85, 91, 64, 88]variance(scores) dà 132.5stddev(scores) to 1 dp dà 11.5Entrambe 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:
# Train delays in minutesdelays = [2, 4, 4, 4, 5, 5, 7, 9]sample_variance(delays) dà 4.5714285714population_variance(delays) dà 4sample_stddev(delays) dà 2.1380899353population_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:
commutes = [24 min, 31 min, 27 min, 22 min]sum(commutes) dà 1 hour 44 minaverage(commutes) dà 26 minmedian(commutes) dà 25.5 minpercentile(commutes, 25) dà 23.5 minpopulation_stddev(commutes) dà 3.3911649916 minsum([1 kg, 500 g]) dà 1.5 kgmodes([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à.
sample_variance([1 kg, 2 kg]) dà Unsupported: A variance squares its observations, so it takes plain numbers; use stddev for amounts with a unitAnche 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:
£12.50 lunch #food dà £12.50£8 coffee #food dà £8.00flights = £420 #trip dà £420.00total of #food dà £20.50Con 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:
#food £12.50#food £8£420 #triptotal of #food dà £20.50average of #food dà £10.25count of #food dà 2min of #food dà £8.00max of #food dà £12.50#food total dà £20.50Food this week: sum of #food dà £20.50eaten = avg #food dà £10.25sum, 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:
£20 shop #food dà £20.00£30 meal out #food dà £30.00total of #food - £10 dà £40.002 * total of #food dà £100.00Cooking kit: total of #food dà £50.00Una 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:
£50 dinner #trip #food dà £50.00£30 taxi #trip dà £30.00£9 sandwich #food dà £9.00total of #trip dà £80.00total of #food dà £59.00total of #trip #food dà £50.00Quali 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:
# Week 1£20 lunch #food dà £20.00total of #food dà £20.00# Week 2£30 lunch #food dà £30.00total of #food dà £30.00Se 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:
£12.50 lunch #food dà £12.50total of #drinks dà Unsupported: no lines tagged #drinks abovering the plumber #jobstotal of #jobs dà Unsupported: no amounts tagged #jobs aboveScrivere 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:
£20 flight #trip/lisbon dà £20.00£35 hotel #Trip/Lisbon dà £35.00total of #trip/lisbon dà £55.00Un # 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 |
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:
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à 3average(filter(s >= 80, s, scores)) dà 88filter(s >= 80, s, scores) significa «i valori s di scores per cui s >= 80». Entrambe le funzioni supportano unità e importi monetari:
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.50Il nome che scegli esiste solo all'interno della chiamata. Non cambia un valore con lo stesso nome altrove nella nota:
x = 10map(x * 2, x, [1, 2, 3]) dà [2, 4, 6]x dà 10La 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:
[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à trueLa 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 invecemap(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 usadot:dot([2, 3, 1], [4, 5, 10])vale33, 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:
# 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:
# Steps, Monday to Sundaysteps = [8200, 10400, 6300, 12000, 9100, 7400, 9600]goal = 9000sum(steps) dà 63,000average(steps) dà 9,000median(steps) dà 9,100Days on target: count(filter(s >= goal, s, steps)) dà 4Spread: max(steps) - min(steps) dà 5,700# Roughly 0.75 m per stepwalked = sum(steps) * 0.75 mwalked in km dà 47.25 kmLa 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.