Hoppa till innehåll
Varlig-guiden
Varligs startsida

Listor och statistik

En lista samlar flera värden under ett namn, till exempel en veckas stegantal, provresultat eller en månads kvittobelopp. När värdena finns i en lista kan du summera dem, räkna ut medelvärdet, mäta spridningen och välja ut de värden du behöver.

Den här sidan beskriver hur du skriver och indexerar listor, beräknar statistiska mått, summerar raderna ovanför, märker rader med taggar för att summera dem oavsett var de finns, sorterar och tar ut delar av listor, omvandlar listor med map och filter samt räknar med hela listor. Använd den när du behöver sammanfatta en kolumn med tal. Listor med rader kan också fungera som matriser, som beskrivs på en egen sida.

Skriva en lista

Skriv värdena inom hakparenteser och skilj dem åt med kommatecken:

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

Ett värdes position i listan kallas index och skrivs inom hakparenteser efter listan. Index börjar på noll, så scores[0] är det första provresultatet och scores[4] det femte. Det sista elementet har alltid index length(scores) - 1. Ett negativt index, ett index som inte är ett heltal eller ett för stort index ger ett fel. Index räknas inte runt från slutet.

Element kan vara beräkningar, kvantiteter med enheter eller andra listor:

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

I nästlade listor väljer det första indexet en inre lista och det andra ett värde i den: [1] väljer [3, 4], och därefter väljer [0] värdet 3.

Tusentalsavgränsare fungerar även i listor, så du kan klistra in tal i det format de redan har. Sätt ett mellanslag efter varje kommatecken mellan värden. Ett kommatecken följt av tre siffror räknas då som en del av talet:

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

Några saker att vara uppmärksam på:

  • Utan mellanslag separerar varje kommatecken, så [8200,10400] har två värden. En lista som [100,200,300] kan vara ett tal eller tre, så Varlig visar ett fel som beskriver båda.
  • Resultat visas med tusentalsavgränsare och ett mellanslag efter kommatecknen mellan värdena. Därför är [8,200, 10,400] en lista med två värden.
  • En lista kan innehålla högst 1 024 värden.

Sammanfattande statistik

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

mean och avg är andra namn för average, total för sum, stdev för stddev och count för length. Du kan alltså använda namn som du känner igen från kalkylblad. product multiplicerar värdena med varandra. För typvärde, percentiler och kvartiler, se nedan.

Med en namngiven lista kan du också skriva statistiken i ord:

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

sum of, mean of, median of, min of, max of och count of fungerar likadant. Efter of skriver du ett namn eller själva värdena, åtskilda med kommatecken, med eller utan runda parenteser. För värden inom hakparenteser använder du funktionsformen, som i average([72, 85, 91]).

De flesta statistiska funktioner, bland annat sum, product, average, median, min, max, count och stddev, tar också emot separata värden i stället för en lista:

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

Addera raderna ovan

En rad som bara innehåller sum, total, subtotal, grand total, average, max eller min beräknar motsvarande värde för resultaten ovanför. Den omfattar sitt eget avsnitt, som börjar vid föregående summa, en avdelare med --- eller en rubrik med #. Varje del av anteckningen får alltså ett eget resultat medan du skriver. Det fungerar som alternativet Subtotal i radens snabbmeny:

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

Ordet kan ha en etikett, tilldelas ett eget namn, följas av en omvandling av resultatet eller ha en kommentar efter sig. På så sätt passar raden in i resten av anteckningen:

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

est = total sparar värdet under ett namn, och total // still to book lägger till en kommentar bredvid det. total in kg omvandlar resultatet innan det visas, vilket är praktiskt om avsnittet innehåller både gram och kilogram. Ett statistikord bredvid en operator ger det värde som ordet skulle ha visat på en egen rad. Därför lägger £5 + subtotal till fem pund till den löpande summan.

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

Om du har gett ett värde namnet sum eller total visar raden ditt värde i stället. Om det inte finns något ovanför att beräkna visas Unsupported: no amounts above to add up i stället för ett tomt resultat eller en nolla. Det beror ofta på en rubrik som du har glömt att den finns där.

Varje belopp räknas en gång. Om en senare rad i avsnittet beräknar något utifrån ett namngivet belopp räknas den senare raden i summan, inte båda. En inköpslista med enhetspriser och antal summeras därför till det du faktiskt ska betala:

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

shirt och shorts räknas via de två rader som använder dem. Däremot finns fee kvar i summan eftersom vat bara tar en andel av det beloppet.

Detta följer hela kedjan av namn. Om en anteckning delar upp ett belopp i andelar och sedan summerar andelarna räknas både raden som summerar dem och det ursprungliga beloppet:

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

Bara värden av samma slag summeras. Procentsatser, värden per enhet och rena antal utelämnas om det finns pengar eller storheter med enheter ovanför. Rader med fel utelämnas också. Vanliga tal som klistrats in i en kolumn tas med om de har samma decimalprecision som beloppen, ned till ören. Tal med fler decimaler, till exempel en växelkurs eller en faktor, utelämnas. Summans hjälpruta anger allt som utelämnats, till exempel "Leaves out line 3 (people = 2)" eller "Leaves out line 2 (an error)", så att du snabbt ser vad resultatet omfattar.

En följd av minst två belopp utan namn summeras separat om den står direkt ovanför summan och nedanför en rad som beräknats utifrån namn. Därmed räknas inte en budget som beräknats högst upp i anteckningen en gång till i listan nedanför:

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

Om du vill summera rader som inte står intill varandra märker du dem med en tagg i stället.

Vanligaste värdena

mode ger det värde som förekommer oftare än alla andra. modes ger en lista med samtliga värden som delar förstaplatsen:

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

mode ger bara ett resultat om exakt ett värde är vanligast. Om inget värde upprepas eller flera är lika vanliga visas ett meddelande i stället för att ett värde väljs:

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

Percentiler och kvartiler

percentile(list, rank) tar en percentilnivå från 0 till 100 och ger värdet där, med interpolering mellan de två närmaste observationerna. quartile(list, k) gör samma sak för fjärdedelar, med k från 0 till 4. Därför motsvarar quartile(list, 1) uttrycket percentile(list, 25):

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

Den 50:e percentilen är medianen. Den 0:e och den 100:e, det vill säga quartile(list, 0) och quartile(list, 4), är det minsta respektive största värdet, precis som min och max. En nivå utanför intervallet ger ett fel i stället för att justeras till närmaste giltiga nivå:

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

Spridning: varians och standardavvikelse

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

Båda är mått för stickprov: de dividerar med ett mindre än antalet värden (n - 1), vilket är det vanliga valet när värdena är ett urval ur en större population. De kräver minst två värden. Lägg till to 1 dp efter ett statistiskt mått för att avrunda det.

Om listan omfattar hela populationen i stället för ett stickprov använder du populationsvarianterna. De dividerar med n och kräver bara ett värde:

calc
# Train delays in minutes
delays = [2, 4, 4, 4, 5, 5, 7, 9]
sample_variance(delays) ger 4.5714285714
population_variance(delays) ger 4
sample_stddev(delays) ger 2.1380899353
population_stddev(delays) ger 2
Anrop Dividerar de kvadrerade skillnaderna med Kräver
variance, sample_variance n - 1 Två värden
population_variance n Ett värde
stddev, stdev, sample_stddev n - 1 Två värden
population_stddev n Ett värde

sample_variance och sample_stddev är längre namn för variance och stddev, så att du kan ange tydligt vilken variant du menar. De korta namnen har alltid avsett stickprovsvarianterna och gör det fortfarande.

Listor med enheter

sum, average, median, mode, modes, percentile, quartile, min, max, stddev och population_stddev behåller enheter och omvandlar mellan kompatibla enheter. Värdena tolkas i det första värdets enhet, och resultatet får samma enhet:

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

Variansfunktionerna är undantaget: de kvadrerar observationerna och behåller då inga enheter. Därför tar de bara emot tal utan enheter.

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

Även sort fungerar bara med tal utan enheter. En statistisk beräkning med inkompatibla enheter, till exempel sum([1 kg, 3 m]), ger ett fel i stället för att hoppa över värden utan att meddela det.

Reglerna för exakthet som gäller för allt detta beskrivs under Vad beräkningsmotorn garanterar.

Tomma listor

Anrop med en tom lista Resultat
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) Fel
variance([]), stddev([]) Fel

En tom lista dyker oftast upp som ett resultat av ett filter som inte matchade något, så en average av en filtrerad lista kan misslyckas även när den ursprungliga listan har värden.

Taggar

En tagg består av # följt direkt av ett ord, till exempel #food. Skriv en tagg var som helst på en rad för att märka raden. Taggen påverkar inte beräkningen, så raden visar fortfarande sitt eget resultat. Den grupperar raden med alla andra rader som har samma tagg. total of #food summerar sedan de raderna:

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

Det är fördelen med en tagg jämfört med en delsumma: raderna behöver inte stå intill varandra. En veckas utgifter, en resa och en inköpslista kan finnas i samma block och ändå få varsin summa längst ned. Håll pekaren över en tagg för att se den aktuella summan.

Alla statistiska mått fungerar med taggar. of är valfritt, taggen kan stå före eller efter ordet och resultatet kan få en etikett eller ett eget namn, precis som på andra rader:

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

sum, total, average, avg, mean, count, min och max tolkar alla uttrycket på detta sätt.

Ett statistiskt mått för en tagg kan användas som ett belopp i en fortsatt beräkning. På så sätt kan du dra av en handpenning från en löpande summa, multiplicera summan med en faktor eller jämföra två taggar:

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

En rad kan ha hur många taggar som helst och räknas med i var och en. Ange två taggar i samma uttryck för att välja de rader som har båda:

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

Det här ingår i en taggsumma

Ett uttryck med taggar omfattar exakt samma rader som en vanlig total och följer samma regler:

  • Det omfattar sitt eget avsnitt, tillbaka till föregående summa, en avdelare med --- eller en rubrik med #.
  • Bara värden av samma slag summeras. Procentsatser, värden per enhet, rena antal och rader med fel utelämnas. Hjälprutan anger vilka, till exempel "Leaves out line 2 (people = 2)".
  • Varje belopp räknas en gång, så ett taggat pris som multipliceras av en senare taggad rad räknas i den raden snarare än i båda.

Det räcker alltså med en rubrik för att hålla en veckas #food åtskild från nästa:

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

Om det inte finns något att summera visar raden ett meddelande i stället för ett tomt resultat eller en nolla. Det beror oftast på ett skrivfel i taggen eller en rubrik som du har glömt att den finns där:

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

Skriva taggnamn

Ett taggnamn kan innehålla bokstäver, siffror, _, - och /. Därför är både #q1-2026 och #trip/lisbon enskilda namn. Stora och små bokstäver gör ingen skillnad:

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

Ett # som inte är kopplat till ett ord behåller sin gamla betydelse, så ingenting du redan skriver ändras:

Du skriver Vad det är
# Weekly shop En kommentar, på grund av mellanslaget efter nummertecknet
5 + 5 # comment Samma sak: allt efter nummertecknet ignoreras
C#4 in Hz Ett musikaliskt höjningstecken, eftersom nummertecknet sitter direkt efter tonen
#1, Invoice #123 Ett tal, inte en tagg: ett taggnamn kan inte börja med en siffra
#ff0000, #fff En färgkod
varlig.app/docs#tags En webbadress med ett fragment

Ett taggnamn måste börja med en bokstav. Tre, fyra, sex eller åtta hexadecimala tecken efter nummertecknet tolkas som en färg. Därför är #fee en färg medan #fees är en tagg.

Taggar i en anteckning och taggar i ett block

Taggarna som organiserar anteckningar i sidofältet beskrivs under Taggar, länkar och bakåtlänkar. De omfattar inte innehållet i beräkningsblock: #food inuti ett block märker raden för summering och visas aldrig i sidofältet. En #food i anteckningens text utanför blocket sorterar däremot anteckningen utan att påverka beräkningarna. Skriv taggen på båda ställena om du vill ha båda funktionerna. Det finns en skillnad i skrivsättet: en tagg i anteckningens text kan innehålla mellanslag om du avslutar den med ett andra #, medan en tagg i ett beräkningsblock alltid slutar vid första mellanslaget.

Referens för listor

Anrop Vad det gör
range(start,end) Heltal från start till end, inklusive båda ändarna
range(start,end,step) Räkna i steg om step, som kan vara negativt eller ett bråktal men inte noll
length(list), count(list) Antal värden
sort(list) Från minst till störst; endast vanliga tal
reverse(list) Samma värden i omvänd ordning; valfria värdetyper
unique(list) Behåll den första förekomsten av varje värde
slice(list,start,end) Värden från index start fram till, men inte inklusive, index end
map(expression,variable,list) Beräkna uttrycket en gång för varje värde
filter(condition,variable,list) Behåll värdena för vilka villkoret är true
calc
range(1, 5) ger [1, 2, 3, 4, 5]
range(0, 100, 25) ger [0, 25, 50, 75, 100]
range(10, 0, -2) ger [10, 8, 6, 4, 2, 0]
scores = [72, 85, 91, 64, 88]
sort(scores) ger [64, 72, 85, 88, 91]
reverse(sort(scores)) ger [91, 88, 85, 72, 64]
slice(sort(scores), 0, 3) ger [64, 72, 85]
unique([4, 2, 4, 6, 2]) ger [4, 2, 6]

reverse(sort(…)) ger störst först, och slice(sort(…), 0, 3) plockar ut de tre lägsta.

Gränserna för ett listutdrag måste uppfylla 0 <= start <= end <= length. Om start och end är lika blir resultatet en tom lista. Kortformen scores[0:2] stöds inte. Skriv slice(scores, 0, 2).

unique jämför värden exakt som de lagras, så 1 kg och 1000 g räknas som två olika värden, och två resultat som skiljer sig åt i tionde decimalstället slås inte ihop.

Avbilda och filtrera

map beräknar ett uttryck för varje värde i en lista. filter behåller de värden som klarar ett test. I båda fallen kommer uttrycket först, sedan ett namn som står för varje värde, sedan listan:

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

Läs filter(s >= 80, s, scores) som "värdena s i scores där s >= 80". Båda fungerar med enheter och pengar:

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

Namnet du väljer finns bara inuti anropet. Det ändrar inte ett värde med samma namn någon annanstans i anteckningen:

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

Villkoret i filter måste vara en jämförelse eller ett annat sant/falskt värde. Ett vanligt tal behandlas inte som sant, så filter(x, x, [0, 1, 2]) är ett fel. Att mappa eller filtrera en tom lista ger en tom lista.

Aritmetik med listor

Du kan multiplicera eller dividera varje värde med ett och samma tal. Du kan också addera eller subtrahera två lika långa listor, värde för värde:

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

Första raden omvandlar provpoäng med maximalt 40 poäng till procent. Raden finals - mocks parar ihop varje elevs resultat på övningsprovet med resultatet på slutprovet.

Vissa operationer stöds inte på listor:

  • Att addera ett enda tal till en lista, som i scores + 5. Använd map(s + 5, s, scores) i stället.
  • Att addera listor med olika längd. Värden upprepas aldrig för att få längderna att stämma.
  • Multiplikation av två platta listor med *. Använd dot för summan av de parvisa produkterna: dot([2, 3, 1], [4, 5, 10]) är 33, till exempel två kaffe à 4, tre te à 5 och en kaka för 10. Mellan listor av rader betyder * matrismultiplikation, som beskrivs i Vektorer och matriser.

Listor över rader

En lista med rader fungerar som en liten tabell. average och sum räknar kolumnvis, medan map kan bearbeta raderna:

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

median, min, max och stddev accepterar inte listor med rader. Använd map över raderna, som i den sista raden, eller dra ut en kolumn till sin egen lista.

De exakta reglerna för alla dessa operationer finns i referensboken för avancerad matematik.

Samlat exempel

Här är en vecka med stegantal från en klocka, med ett dagligt mål:

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

Genomsnittet landar exakt på målet, men bara fyra dagar nådde det, och det finns 5 700 steg mellan de bästa och sämsta dagarna. Ändra goal eller klistra in nästa veckas antal och varje rad uppdateras.