Przejdź do treści
Przewodnik po Varlig
Strona główna Varlig

Listy i statystyka

Lista przechowuje kilka wartości pod jedną nazwą: tygodniowe liczby kroków, oceny z egzaminów czy miesięczne paragony. Możesz je sumować, uśredniać, mierzyć ich rozrzut i wybierać potrzebne elementy.

Ta strona opisuje zapis i indeksowanie list, statystyki, sumowanie wcześniejszych wierszy, oznaczanie tagami do sumowania niezależnie od położenia, sortowanie, wycinki, map, filter i arytmetykę całych list. Przydaje się do podsumowania kolumn liczb. Listy wierszy mogą być też macierzami, które mają osobną stronę.

Zapisywanie listy

Umieść wartości w nawiasach kwadratowych, oddzielone przecinkami:

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

Pozycja wartości to indeks zapisany w nawiasach kwadratowych za listą. Indeksy zaczynają się od zera, więc scores[0] to pierwsza ocena, a scores[4] piąta. Ostatni element ma zawsze indeks length(scores) - 1. Indeks ujemny, ułamkowy lub zbyt duży jest błędem; indeksy nie liczą od końca.

Elementami mogą być obliczenia, wielkości z jednostkami lub inne listy:

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

W listach zagnieżdżonych pierwszy indeks wybiera listę wewnętrzną, a drugi jej wartość: [1] wskazuje [3, 4], a następnie [0] wybiera 3.

Separatory tysięcy działają w listach, więc można wklejać liczby w oryginalnym zapisie. Dodaj spację po przecinku między wartościami; przecinek z trzema cyframi pozostaje częścią liczby:

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

Na co zwrócić uwagę:

  • Bez spacji każdy przecinek rozdziela wartości, więc [8200,10400] ma dwa elementy. [100,200,300] może oznaczać jedną liczbę lub trzy, dlatego Varlig pokazuje błąd wyjaśniający obie interpretacje.
  • Wyniki mają separatory tysięcy i spację po przecinku między elementami, więc [8,200, 10,400] jest listą dwóch wartości.
  • Lista może mieć najwyżej 1024 wartości.

Statystyki opisowe

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

mean i avg to inne nazwy average, total oznacza sum, stdev oznacza stddev, a count — length, więc przyzwyczajenia z arkuszy nadal się przydają. product mnoży wartości. Najczęstszą wartość, percentyl i kwartyl opisano poniżej.

Dla nazwanej listy statystykę można też zapisać słownie:

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

sum of, mean of, median of, min of, max of i count of działają tak samo. Po of wpisz nazwę lub wartości oddzielone przecinkami, z nawiasami okrągłymi lub bez. Dla wartości w nawiasach kwadratowych użyj funkcji, jak w average([72, 85, 91]).

Większość statystyk, w tym sum, product, average, median, min, max, count i stddev, przyjmuje też osobne wartości zamiast listy:

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

Sumowanie poprzednich wierszy

Wiersz zawierający tylko sum, total, subtotal, grand total, average, max lub min oblicza tę statystykę dla wyników powyżej. Obejmuje własną sekcję, od poprzedniej sumy, separatora --- lub nagłówka #, dzięki czemu każda część notatki ma własny wynik. Działa jak Subtotal w menu kontekstowym wiersza:

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

Słowo może mieć etykietę, zostać przypisane do nazwy, przeliczać wynik albo mieć komentarz za sobą, aby wiersz pasował do reszty notatki:

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

est = total zapisuje wynik pod nazwą, a total // still to book dodaje uwagę obok. total in kg przelicza wynik przed wyświetleniem, co pomaga przy mieszaniu gramów i kilogramów. Słowo statystyki obok operatora oznacza wynik, który dałoby samodzielnie, więc £5 + subtotal dodaje pięć funtów do bieżącej sumy.

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

Jeśli wartość ma już nazwę sum lub total, wiersz pokazuje tę wartość. Gdy powyżej nie ma nic do obliczenia, pojawia się Unsupported: no amounts above to add up, a nie puste miejsce czy zero. Zwykle przyczyną jest zapomniany nagłówek.

Każda kwota jest liczona raz. Jeśli późniejszy wiersz sekcji oblicza coś z nazwanej kwoty, suma uwzględnia ten wiersz zamiast obu. Lista cen jednostkowych i ilości sumuje się więc do faktycznej należności:

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

shirt i shorts są uwzględnione w dwóch używających ich wierszach, a fee pozostaje w sumie, ponieważ vat pobiera tylko jego część.

Reguła podąża za całym łańcuchem nazw. Gdy notatka dzieli kwotę na części, a potem je sumuje, liczony jest wiersz sumujący oraz pierwotna kwota, z której pochodziły części:

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

Dodawane są tylko zgodne wielkości. Gdy powyżej są pieniądze lub wielkość z jednostką, procenty, stawki i zwykłe liczebności są pomijane, podobnie jak błędne wiersze. Liczby bez jednostek wklejone w kolumnie są dodawane, jeśli zapisano je z dokładnością do setnych, jak kwoty; liczby z większą liczbą miejsc, na przykład kurs lub mnożnik, są pomijane. Podpowiedź sumy wymienia pominięcia, na przykład „Leaves out line 3 (people = 2)” lub „Leaves out line 2 (an error)”, aby łatwo sprawdzić skład wyniku.

Lista co najmniej dwóch nienazwanych kwot bezpośrednio nad sumą i pod wierszem obliczonym z nazw jest sumowana osobno. Dzięki temu budżet wyliczony na górze nie trafia ponownie do listy poniżej:

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

Aby sumować wiersze, które nie sąsiadują, oznacz je tagiem.

Najczęstsze wartości

mode zwraca wartość występującą częściej niż pozostałe, a modes — listę wszystkich wartości o najwyższej częstości:

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

mode zwraca wynik tylko dla jednej ściśle najczęstszej wartości. Jeśli nic się nie powtarza lub jest remis, informuje o tym zamiast wybierać:

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

Percentyle i kwartyle

percentile(list, rank) przyjmuje pozycję od 0 do 100 i zwraca odpowiadającą wartość, interpolując między dwiema najbliższymi obserwacjami. quartile(list, k) działa tak samo dla ćwiartek, z k od 0 do 4, więc quartile(list, 1) to percentile(list, 25):

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

Percentyl 50 to mediana, a 0 i 100 — quartile(list, 0) i quartile(list, 4) — to minimum i maksimum, tak jak min i max. Pozycja poza zakresem daje błąd zamiast najbliższej dopuszczalnej wartości:

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

Rozproszenie: wariancja i odchylenie standardowe

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

Obie są statystykami próby: dzielą przez liczbę wartości pomniejszoną o jeden (n - 1), co jest typowym wyborem dla próby z większej populacji. Wymagają co najmniej dwóch wartości. Dodaj to 1 dp po dowolnej statystyce, aby ją zaokrąglić.

Jeśli lista obejmuje całą populację, użyj wariantów populacyjnych, które dzielą przez n i wymagają tylko jednej wartości:

calc
# Train delays in minutes
delays = [2, 4, 4, 4, 5, 5, 7, 9]
sample_variance(delays) daje 4.5714285714
population_variance(delays) daje 4
sample_stddev(delays) daje 2.1380899353
population_stddev(delays) daje 2
Wywołanie Dzieli sumę kwadratów różnic przez Wymagane
variance, sample_variance n - 1 Dwie wartości
population_variance n Jedna wartość
stddev, stdev, sample_stddev n - 1 Dwie wartości
population_stddev n Jedna wartość

sample_variance i sample_stddev to pełniejsze nazwy variance i stddev, pozwalające jawnie wskazać próbę. Krótkie nazwy zawsze oznaczały statystyki próby i nadal je oznaczają.

Listy z jednostkami

sum, average, median, mode, modes, percentile, quartile, min, max, stddev i population_stddev zachowują jednostki i przeliczają zgodne jednostki. Wartości są odczytywane w jednostce pierwszego elementu, w której wraca wynik:

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

Wyjątkiem są wariancje: podnoszą obserwacje do kwadratu i nie zachowują jednostek, dlatego przyjmują wyłącznie liczby bez jednostek.

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

sort również działa tylko na liczbach bez jednostek. Statystyka na niezgodnych jednostkach, jak sum([1 kg, 3 m]), daje błąd zamiast po cichu pomijać wartości.

Zasady dokładności opisuje Co gwarantuje silnik.

Puste listy

Wywołanie dla pustej listy Wynik
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) Błąd
variance([]), stddev([]) Błąd

Pusta lista najczęściej powstaje po filter, który niczego nie dopasował. Dlatego average przefiltrowanej listy może dać błąd, nawet jeśli oryginalna lista miała wartości.

Tagi

Tag to # bezpośrednio połączony ze słowem, na przykład #food. Umieść go w dowolnym miejscu wiersza, aby go oznaczyć. Nie uczestniczy w obliczeniu, więc wiersz nadal pokazuje własny wynik, a tag grupuje go z pozostałymi wierszami o tym oznaczeniu. total of #food je sumuje:

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

To przewaga tagu nad sumą częściową: wiersze nie muszą sąsiadować. Wydatki tygodnia, podróż i zakupy mogą dzielić blok, każde z osobną sumą na dole. Najedź na tag, aby zobaczyć bieżącą sumę.

Każda statystyka działa na tagu. of jest opcjonalne, tag może być przed słowem lub po nim, a wynik może mieć etykietę lub własną nazwę jak każdy wiersz:

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

Tak działają sum, total, average, avg, mean, count, min i max.

Statystyka tagu zajmuje miejsce kwoty, więc można kontynuować obliczenie: odjąć zaliczkę od sumy, pomnożyć ją lub porównać dwa tagi:

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

Wiersz może mieć dowolnie wiele tagów, a każdy go uwzględnia. Podanie dwóch tagów w jednym wyrażeniu wybiera wiersze mające oba:

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

Zakres sumy tagu

Wyrażenie z tagiem obejmuje dokładnie te same wiersze co zwykłe total i stosuje te same zasady:

  • Obejmuje własną sekcję do poprzedniej sumy, separatora --- lub nagłówka #.
  • Dodaje tylko zgodne wielkości. Pomija procenty, stawki, zwykłe liczebności i błędne wiersze, wymieniając je w podpowiedzi, na przykład „Leaves out line 2 (people = 2)”.
  • Każda kwota jest liczona raz. Oznaczona cena pomnożona w późniejszym oznaczonym wierszu jest uwzględniana w tym wierszu, a nie w obu.

Wystarczy więc nagłówek, aby oddzielić #food jednego tygodnia od kolejnego:

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

Jeśli nie ma czego sumować, wiersz informuje o tym zamiast pokazywać pustkę lub zero. Zwykle oznacza to literówkę w tagu lub zapomniany nagłówek:

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

Zapisywanie nazw tagów

Nazwa tagu może zawierać litery, cyfry, _, - i /, więc #q1-2026 i #trip/lisbon są pojedynczymi nazwami. Wielkość liter nie ma znaczenia:

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

# niepołączone ze słowem zachowuje dotychczasowe znaczenie, więc wcześniejsze zapisy się nie zmieniają:

Wpisujesz Interpretacja
# Weekly shop Komentarz ze względu na spację po znaku #
5 + 5 # comment Tak samo: wszystko po znaku # jest pomijane
C#4 in Hz Krzyżyk muzyczny, ponieważ znak # przylega do nazwy dźwięku
#1, Invoice #123 Numer, nie tag: nazwa tagu nie może zaczynać się cyfrą
#ff0000, #fff Kod koloru
varlig.app/docs#tags Adres internetowy z identyfikatorem fragmentu

Nazwa tagu musi zaczynać się literą. Trzy, cztery, sześć lub osiem cyfr szesnastkowych po kratce jest odczytywane jako kolor, więc #fee to kolor, a #fees to tag.

Tagi w notatce i w bloku

Tagi porządkujące notatki na pasku bocznym opisuje Tagi, odsyłacze i odsyłacze zwrotne. Ich działanie kończy się na granicy bloku obliczeniowego: #food wewnątrz bloku oznacza wiersz do sumowania i nie pojawia się na pasku, a #food w otaczającej treści przypisuje notatkę do tagu bez wpływu na obliczenia. Jeśli potrzebujesz obu funkcji, wpisz tag w obu miejscach. Jest też różnica składni: tag notatki może zawierać spacje, jeśli zamkniesz go drugim #, a tag obliczenia zawsze kończy się na pierwszej spacji.

Spis operacji na listach

Wywołanie Działanie
range(start,end) Liczby całkowite od start do end, z obiema granicami włącznie
range(start,end,step) Kolejne wartości co step; krok może być ujemny lub ułamkowy, ale nie zerowy
length(list), count(list) Liczba wartości
sort(list) Od najmniejszej do największej; tylko liczby bez jednostek
reverse(list) Te same wartości w odwrotnej kolejności; dowolne wartości
unique(list) Zachowuje pierwsze wystąpienie każdej wartości
slice(list,start,end) Wartości od indeksu start do indeksu end, bez końcowego indeksu
map(expression,variable,list) Oblicza wyrażenie raz dla każdej wartości
filter(condition,variable,list) Zachowuje wartości, dla których warunek daje true
calc
range(1, 5) daje [1, 2, 3, 4, 5]
range(0, 100, 25) daje [0, 25, 50, 75, 100]
range(10, 0, -2) daje [10, 8, 6, 4, 2, 0]
scores = [72, 85, 91, 64, 88]
sort(scores) daje [64, 72, 85, 88, 91]
reverse(sort(scores)) daje [91, 88, 85, 72, 64]
slice(sort(scores), 0, 3) daje [64, 72, 85]
unique([4, 2, 4, 6, 2]) daje [4, 2, 6]

reverse(sort(…)) daje kolejność od największej, a slice(sort(…), 0, 3) wybiera trzy najmniejsze wartości.

Granice wycinka muszą spełniać 0 <= start <= end <= length. Równe start i end dają pustą listę. Nie ma skrótu scores[0:2]; użyj slice(scores, 0, 2).

unique porównuje wartości dokładnie w zapisanej postaci, więc 1 kg i 1000 g są dwiema różnymi wartościami. Wyniki różniące się na dziesiątym miejscu dziesiętnym nie są łączone.

Mapowanie i filtrowanie

map oblicza wyrażenie dla każdej wartości listy. filter zachowuje wartości spełniające warunek. W obu najpierw podajesz wyrażenie, potem nazwę reprezentującą kolejne wartości, a na końcu listę:

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

filter(s >= 80, s, scores) czytaj jako „wartości s z scores, dla których s >= 80”. Obie funkcje działają z jednostkami i pieniędzmi:

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

Wybrana nazwa istnieje tylko w wywołaniu. Nie zmienia wartości o tej samej nazwie w innym miejscu notatki:

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

Warunek filter musi być porównaniem lub inną wartością prawda/fałsz. Liczba nie jest traktowana jak prawda, więc filter(x, x, [0, 1, 2]) jest błędem. Mapowanie i filtrowanie pustej listy daje pustą listę.

Arytmetyka list

Możesz mnożyć lub dzielić wszystkie wartości przez jedną liczbę oraz dodawać i odejmować listy tej samej długości element po elemencie:

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

Pierwszy wiersz zmienia wyniki na 40 punktów w procenty. finals - mocks łączy wynik próbnego egzaminu każdego ucznia z jego wynikiem końcowym.

Niektóre operacje nie są obsługiwane na listach:

  • Dodanie pojedynczej liczby, jak scores + 5. Użyj map(s + 5, s, scores).
  • Dodawanie list o różnych długościach. Wartości nigdy nie są powielane w celu wyrównania długości.
  • Mnożenie dwóch płaskich list przez *. Do sumy iloczynów odpowiadających elementów użyj dot: dot([2, 3, 1], [4, 5, 10]) daje 33, na przykład za dwie kawy po 4, trzy herbaty po 5 i ciasto za 10. Dla list wierszy * oznacza mnożenie macierzy, opisane w Wektory i macierze.

Listy wierszy

Lista wierszy działa jak mała tabela. average i sum obliczają kolumny, a map może działać na wierszach:

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

median, min, max i stddev nie przyjmują list wierszy. Użyj map na wierszach, jak w ostatnim przykładzie, lub wydziel kolumnę do osobnej listy.

Dokładne zasady tych operacji są w dokumentacji zaawansowanej matematyki.

Przykład całościowy

Oto tygodniowa lista kroków z zegarka z dziennym celem:

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

Średnia dokładnie odpowiada celowi, ale osiągnięto go tylko przez cztery dni, a najlepszy i najgorszy dzień różni 5700 kroków. Zmień goal lub wklej kolejny tydzień, a wszystkie wiersze się zaktualizują.