Spring naar inhoud
Varlig-handleiding
Varlig-startpagina

Lijsten en statistiek

Een lijst houdt meerdere waarden onder één naam bijeen, zoals een week aan stappentellingen, examencijfers of maandelijkse bonnen. Daarna kun je ze optellen, middelen, spreiding meten en relevante waarden selecteren.

Deze pagina behandelt lijsten invoeren en indexeren, beschrijvende statistiek, bovenliggende regels optellen, regels met tags labelen voor totalen ongeacht hun positie, sorteren en delen selecteren, bewerken met map en filter, en rekenen met hele lijsten. Gebruik dit om een kolom cijfers samen te vatten. Lijsten van rijen kunnen ook matrices vormen; die hebben een eigen pagina.

Een lijst schrijven

Zet de waarden tussen vierkante haken, gescheiden door komma’s:

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

De positie van een waarde is de index, tussen vierkante haken na de lijst. Indexen beginnen bij nul: scores[0] is het eerste cijfer en scores[4] het vijfde. Het laatste element staat altijd op length(scores) - 1. Een negatieve, gebroken of te grote index geeft een fout; indexen lopen niet vanaf het einde terug.

Elementen mogen berekeningen, hoeveelheden met eenheden of andere lijsten zijn:

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

Bij geneste lijsten kiest de eerste index de binnenste lijst en de tweede een waarde daarin: [1] kiest [3, 4], daarna kiest [0] de waarde 3.

Duizendtalscheiding werkt in lijsten, zodat je getallen zoals geschreven kunt plakken. Zet een spatie na elke komma tussen waarden; een komma met direct drie cijfers blijft onderdeel van het getal:

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

Let op het volgende:

  • Zonder spaties scheidt elke komma waarden, dus [8200,10400] bevat twee waarden. [100,200,300] kan één getal of drie zijn; Varlig geeft dan een fout die beide interpretaties noemt.
  • Resultaten tonen duizendtalscheiding en een spatie na elke scheidingskomma. [8,200, 10,400] is dus een lijst van twee waarden.
  • Een lijst bevat maximaal 1.024 waarden.

Samenvattende statistiek

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

mean en avg zijn andere namen voor average, total voor sum, stdev voor stddev en count voor length. Spreadsheetgewoonten blijven dus bruikbaar. product vermenigvuldigt de waarden. Zie hieronder voor de meest voorkomende waarde, percentielen en kwartielen.

Bij een benoemde lijst kun je de statistiek ook in woorden schrijven:

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

sum of, mean of, median of, min of, max of en count of werken hetzelfde. Schrijf na of een naam of kommagescheiden waarden, met of zonder ronde haakjes. Gebruik voor waarden tussen vierkante haken de functievorm, zoals average([72, 85, 91]).

De meeste statistieken, waaronder sum, product, average, median, min, max, count en stddev, accepteren ook losse waarden in plaats van een lijst:

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

De regels erboven optellen

Een regel met alleen sum, total, subtotal, grand total, average, max of min berekent die statistiek over de resultaten erboven. Ze geldt voor de eigen sectie, vanaf het vorige totaal, een scheidingslijn --- of een kop #. Zo krijgt elk notitiedeel tijdens het typen een eigen cijfer. Dit werkt zoals Subtotal in het contextmenu van een regel:

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

Het woord mag een label, eigen naam, omrekening of opmerking krijgen, zodat de regel bij de rest van de notitie past:

calc
tickets = £64
train = £41.20
Estimated total: total geeft £105.20

est = total bewaart het cijfer onder een naam; total // still to book zet er een opmerking bij. total in kg rekent vóór weergave om, handig bij gram en kilogram door elkaar. Een statistiekwoord naast een operator gebruikt het cijfer dat een eigen regel zou tonen: £5 + subtotal telt vijf pond bij het lopende totaal op.

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

Heb je een waarde sum of total genoemd, dan toont de regel die eigen waarde. Staat er niets bruikbaars boven, dan verschijnt Unsupported: no amounts above to add up in plaats van leegte of nul. Vaak staat er dan een vergeten kop boven.

Elk bedrag telt eenmaal. Als een latere regel in de sectie verder rekent met een benoemd bedrag, telt het totaal die regel in plaats van beide. Zo geeft een boodschappenlijst met eenheidsprijzen en aantallen wat je werkelijk betaalt:

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

shirt en shorts tellen via de twee regels die ze gebruiken. fee blijft in het totaal omdat vat er alleen een aandeel van neemt.

Dit volgt een keten van namen tot het einde. Splitst een notitie een bedrag in aandelen en telt die daarna weer op, dan telt de optellende regel mee én het oorspronkelijke bedrag:

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

Alleen gelijksoortige bedragen worden opgeteld. Percentages, tarieven en gewone aantallen blijven buiten beschouwing als erboven geld of een hoeveelheid staat, net als foutregels. Losse getallen in een kolom tellen mee als ze tot op de cent zijn geschreven zoals bedragen. Extra decimalen, bijvoorbeeld bij een wisselkoers of factor, worden overgeslagen. De toelichting benoemt alles wat buiten het totaal blijft, zoals regel 3 met people = 2 of regel 2 met een fout. Zo zie je direct wat is meegeteld.

Een reeks van twee of meer onbenoemde bedragen direct boven het totaal, maar onder een uit namen berekende regel, wordt apart opgeteld. Zo telt een budgetberekening bovenaan niet opnieuw mee in de lijst eronder:

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

Label niet-aangrenzende regels met een tag om ze samen op te tellen.

Meest voorkomende waarden

mode geeft de waarde die vaker dan alle andere voorkomt. modes geeft als lijst alle waarden die de hoogste frequentie delen:

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

mode geeft alleen een resultaat als één waarde strikt het vaakst voorkomt. Zonder herhaling of bij een gedeelde eerste plaats meldt het dat, in plaats van een waarde te kiezen:

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

Percentielen en kwartielen

percentile(list, rank) accepteert een rang van 0 tot 100 en geeft de waarde op dat punt, met interpolatie tussen de twee dichtstbijzijnde waarnemingen. quartile(list, k) doet hetzelfde per kwart, met k van 0 tot 4: quartile(list, 1) is percentile(list, 25):

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

Het 50e percentiel is de mediaan. Het 0e en 100e — quartile(list, 0) en quartile(list, 4) — zijn minimum en maximum, gelijk aan min en max. Een rang buiten het bereik geeft een fout, niet de dichtstbijzijnde geldige waarde:

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

Spreiding: variantie en standaardafwijking

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

Beide zijn steekproefstatistieken: ze delen door het aantal waarden min één (n - 1), gebruikelijk als je cijfers een steekproef uit een groter geheel zijn. Ze vereisen minstens twee waarden. Voeg to 1 dp toe om een statistiek af te ronden.

Is je lijst de volledige populatie in plaats van een steekproef, gebruik dan de populatievormen. Die delen door n en hebben aan één waarde genoeg:

calc
# Train delays in minutes
delays = [2, 4, 4, 4, 5, 5, 7, 9]
sample_variance(delays) geeft 4.5714285714
population_variance(delays) geeft 4
sample_stddev(delays) geeft 2.1380899353
population_stddev(delays) geeft 2
Aanroep Deelt de gekwadrateerde afwijkingen door Vereist
variance, sample_variance n - 1 Twee waarden
population_variance n Eén waarde
stddev, stdev, sample_stddev n - 1 Twee waarden
population_stddev n Eén waarde

sample_variance en sample_stddev zijn langere namen voor variance en stddev, waarmee je de bedoelde variant expliciet maakt. De korte namen waren en blijven de steekproefvormen.

Lijsten met eenheden

sum, average, median, mode, modes, percentile, quartile, min, max, stddev en population_stddev behouden eenheden en rekenen compatibele eenheden om. Waarden worden in de eenheid van het eerste element gelezen; ook het resultaat gebruikt die eenheid:

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

Varianties zijn de uitzondering: ze kwadrateren waarnemingen en behouden daarbij geen eenheid. Daarom accepteren ze alleen gewone getallen.

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

Ook sort werkt alleen met gewone getallen. Een statistiek met onverenigbare eenheden, zoals sum([1 kg, 3 m]), geeft een fout in plaats van waarden stilzwijgend over te slaan.

De exactheidsregels staan bij Wat de rekenengine garandeert.

Lege lijsten

Aanroep op een lege lijst Resultaat
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) Fout
variance([]), stddev([]) Fout

Een lege lijst ontstaat vaak door een filter zonder overeenkomsten. Daardoor kan average op een gefilterde lijst mislukken, ook als de oorspronkelijke lijst waarden bevat.

Tags

Een tag is een # direct gevolgd door een woord, zoals #food. Zet hem ergens op een regel om die te labelen. De tag doet niet mee aan de berekening: de regel toont haar eigen resultaat en wordt gegroepeerd met alle regels met dezelfde tag. total of #food telt ze op:

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

Dat kan een tag wat een subtotaal niet kan: de regels hoeven niet naast elkaar te staan. Een week uitgaven, een reis en een boodschappenlijst kunnen één blok delen met elk een eigen totaal onderaan. Houd de aanwijzer boven een tag voor het huidige totaal.

Elke statistiek werkt op een tag. of is optioneel, de tag mag vóór of na het woord staan en het resultaat kan zoals elke regel een label of eigen naam krijgen:

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

sum, total, average, avg, mean, count, min en max worden allemaal zo gelezen.

Een tagstatistiek kan overal staan waar een bedrag past; je kunt er dus mee doorrekenen. Zo trek je een aanbetaling van een lopend totaal af, schaal je het op of vergelijk je twee tags:

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

Een regel mag zoveel tags hebben als je wilt; elke tag telt de regel mee. Noem twee tags in één formulering en je krijgt de regels die beide dragen:

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

Wat een tagtotaal omvat

Een tagformulering bekijkt precies dezelfde regels als een gewone total en volgt dezelfde regels:

  • Ze geldt voor de eigen sectie, terug tot het vorige totaal, een scheidingslijn --- of een kop #.
  • Ze telt alleen gelijksoortige bedragen op. Percentages, tarieven, gewone aantallen en foutregels blijven erbuiten; de toelichting noemt ze, bijvoorbeeld regel 2 met people = 2.
  • Elk bedrag telt eenmaal. Een prijs met tag die een latere regel met dezelfde tag vermenigvuldigt, telt via die latere regel mee, niet via beide.

Eén kop is dus genoeg om #food van de ene week van de volgende te scheiden:

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

Als er niets op te tellen is, meldt de regel dat in plaats van leegte of nul te tonen. Vaak gaat het om een typefout in de tag of een vergeten kop:

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

Tagnamen schrijven

Een tagnaam mag letters, cijfers, _, - en / bevatten. #q1-2026 en #trip/lisbon zijn dus elk één naam. Hoofdletters maken niet uit:

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

Een # dat niet direct aan een woord vastzit behoudt zijn oude betekenis, zodat bestaande tekst niet verandert:

Je schrijft Betekenis
# Weekly shop Een opmerking, door de spatie na het hekje
5 + 5 # comment Hetzelfde: alles na het hekje wordt genegeerd
C#4 in Hz Een muzikaal kruis, omdat het hekje aan de noot vast staat
#1, Invoice #123 Een getal, geen tag: een tagnaam mag niet met een cijfer beginnen
#ff0000, #fff Een kleurcode
varlig.app/docs#tags Een webadres met een fragment

Een tagnaam moet met een letter beginnen. Drie, vier, zes of acht hexadecimale cijfers na het hekje worden als kleur gelezen: #fee is dus een kleur, #fees een tag.

Tags in een notitie en tags in een blok

Tags die notities in de zijbalk ordenen staan beschreven bij Tags, links en terugverwijzingen. Die gelden niet binnen een rekenblok: #food daar labelt alleen de regel voor totalen en verschijnt nooit in de zijbalk. #food buiten het blok ordent de notitie zonder de berekeningen te beïnvloeden. Schrijf de tag op beide plekken als je beide wilt. Er is één verschil: een notitietag mag spaties bevatten als je hem met een tweede # afsluit; een tag in een rekenblok eindigt altijd bij de eerste spatie.

Lijstfuncties

Aanroep Wat deze doet
range(start,end) Gehele getallen van start tot en met end
range(start,end,step) Tellen met step, die negatief of niet-geheel mag zijn, maar niet nul
length(list), count(list) Aantal waarden
sort(list) Van klein naar groot; alleen getallen zonder eenheid
reverse(list) Dezelfde waarden in omgekeerde volgorde; elk waardetype
unique(list) Behoudt de eerste keer dat elke waarde voorkomt
slice(list,start,end) Waarden vanaf index start tot, maar niet inclusief, index end
map(expression,variable,list) Berekent de uitdrukking eenmaal voor elke waarde
filter(condition,variable,list) Behoudt de waarden waarvoor de voorwaarde true is
calc
range(1, 5) geeft [1, 2, 3, 4, 5]
range(0, 100, 25) geeft [0, 25, 50, 75, 100]
range(10, 0, -2) geeft [10, 8, 6, 4, 2, 0]
scores = [72, 85, 91, 64, 88]
sort(scores) geeft [64, 72, 85, 88, 91]
reverse(sort(scores)) geeft [91, 88, 85, 72, 64]
slice(sort(scores), 0, 3) geeft [64, 72, 85]
unique([4, 2, 4, 6, 2]) geeft [4, 2, 6]

reverse(sort(…)) zet de grootste waarde eerst; slice(sort(…), 0, 3) selecteert de drie laagste.

De grenzen moeten voldoen aan 0 <= start <= end <= length. Gelijke start en end geven een lege lijst. Er is geen verkorte notatie scores[0:2]; schrijf slice(scores, 0, 2).

unique vergelijkt waarden exact zoals opgeslagen. 1 kg en 1000 g tellen dus als twee verschillende waarden. Ook resultaten die op de tiende decimaal verschillen worden niet samengevoegd.

Map en filter

map berekent een uitdrukking voor elke lijstwaarde. filter behoudt waarden die aan een test voldoen. In beide staat eerst de uitdrukking, dan een naam voor elke waarde, dan de lijst:

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

Lees filter(s >= 80, s, scores) als “de waarden s in scores waarvoor s >= 80”. Beide werken met eenheden en geld:

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

De gekozen naam bestaat alleen binnen de aanroep en verandert geen gelijknamige waarde elders in de notitie:

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

De voorwaarde in filter moet een vergelijking of andere waar/onwaar-waarde zijn. Een gewoon getal geldt niet als waar, dus filter(x, x, [0, 1, 2]) is een fout. Een lege lijst mappen of filteren geeft een lege lijst.

Rekenen met lijsten

Je kunt elke waarde met één getal vermenigvuldigen of delen, en twee even lange lijsten per element optellen of aftrekken:

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

De eerste regel zet scores op 40 om in percentages. finals - mocks koppelt het oefenexamencijfer van elke student aan diens eindcijfer.

Sommige bewerkingen worden niet ondersteund op lijsten:

  • Eén getal bij een lijst optellen, zoals scores + 5. Gebruik map(s + 5, s, scores).
  • Lijsten van verschillende lengtes optellen. Waarden worden nooit herhaald om lengtes passend te maken.
  • Twee vlakke lijsten met * vermenigvuldigen. Gebruik dot voor de som van paarsgewijze producten: dot([2, 3, 1], [4, 5, 10]) is 33, bijvoorbeeld twee koffies van 4, drie theeën van 5 en één gebakje van 10. Tussen lijsten van rijen betekent * matrixvermenigvuldiging; zie Vectoren en matrices.

Lijsten van rijen

Een lijst van rijen werkt als kleine tabel. average en sum rekenen per kolom; map kan per rij werken:

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

median, min, max en stddev accepteren geen lijsten van rijen. Gebruik map over de rijen, zoals in de laatste regel, of haal een kolom als aparte lijst op.

De exacte regels voor al deze bewerkingen staan in de referentie voor geavanceerde wiskunde.

Alles combineren

Hier staat een week aan stappentellingen van een horloge, met een dagelijks doel:

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

Het gemiddelde ligt precies op het doel, maar slechts vier dagen haalden het. Tussen de beste en slechtste dag zitten 5.700 stappen. Verander goal of plak de volgende week in en elke regel wordt bijgewerkt.