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:
scores = [72, 85, 91, 64, 88] daje [72, 85, 91, 64, 88]scores[0] daje 72scores[4] daje 88length(scores) daje 5Pozycja 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:
[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 3W 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:
salaries = [£32,000, £41,500, £38,250] daje [£32,000.00, £41,500.00, £38,250.00]average(salaries) daje £37,250.00Na 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
scores = [72, 85, 91, 64, 88]sum(scores) daje 400average(scores) daje 80median(scores) daje 85min(scores) daje 64max(scores) daje 91count(scores) daje 5mean 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:
scores = [72, 85, 91, 64, 88]average of scores daje 80total of scores daje 400sum 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:
max(72, 85, 91) daje 91sum(1, 2, 3, 4) daje 10average of 70, 85, 91 daje 82mean of (1,2,3) daje 2average(1,200, 1,800) daje 1,500Sumowanie 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:
# Groceriesbread = £1.20milk = £1.45eggs = £2.30total daje £4.95# Householdbin bags = £3.50washing up liquid = £1.80total daje £5.30Słowo może mieć etykietę, zostać przypisane do nazwy, przeliczać wynik albo mieć komentarz za sobą, aby wiersz pasował do reszty notatki:
tickets = £64train = £41.20Estimated total: total daje £105.20est = 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.
# Parcels12 kg daje 12 kg4 kg daje 4 kg850 g daje 850 gtotal in kg daje 16.85 kgmax daje 12 kgJeś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:
shirt = £18.50shorts = £99 * shirt daje £166.5010 * shorts daje £90.00fee = £40vat = fee * 20% daje £8.00total daje £304.50shirt 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:
pot = £9001st = 50% of pot daje £450.002nd = 30% of pot daje £270.003rd = 20% of pot daje £180.001st + 2nd + 3rd daje £900.00total daje £900.00Dodawane 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:
budget = £18,000remaining = budget - £6,388.25 daje £11,611.75- skip hire £250 daje £250.00- deep clean £120 daje £120.00subtotal daje £370.00Aby 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:
marks = [3, 4, 4, 5, 5, 5, 6]mode(marks) daje 5modes([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ć:
mode([1, 2, 3]) daje Unsupported: No value repeats, so this list has no mode; use median or average insteadPercentyle 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):
scores = [72, 85, 91, 64, 88]percentile(scores, 50) daje 85percentile(scores, 25) daje 72quartile(scores, 3) daje 88quartile(scores, 4) daje 91percentile([1, 2, 3, 4], 25) daje 1.75quartile([1, 2, 3, 4], 3) daje 3.25Percentyl 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:
percentile([1, 2, 3, 4], 101) daje Unsupported: A percentile is between 0 and 100quartile([1, 2, 3, 4], 5) daje Unsupported: A quartile is 0, 1, 2, 3 or 4Rozproszenie: wariancja i odchylenie standardowe
scores = [72, 85, 91, 64, 88]variance(scores) daje 132.5stddev(scores) to 1 dp daje 11.5Obie 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:
# Train delays in minutesdelays = [2, 4, 4, 4, 5, 5, 7, 9]sample_variance(delays) daje 4.5714285714population_variance(delays) daje 4sample_stddev(delays) daje 2.1380899353population_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:
commutes = [24 min, 31 min, 27 min, 22 min]sum(commutes) daje 1 hour 44 minaverage(commutes) daje 26 minmedian(commutes) daje 25.5 minpercentile(commutes, 25) daje 23.5 minpopulation_stddev(commutes) daje 3.3911649916 minsum([1 kg, 500 g]) daje 1.5 kgmodes([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.
sample_variance([1 kg, 2 kg]) daje Unsupported: A variance squares its observations, so it takes plain numbers; use stddev for amounts with a unitsort 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:
£12.50 lunch #food daje £12.50£8 coffee #food daje £8.00flights = £420 #trip daje £420.00total of #food daje £20.50To 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:
#food £12.50#food £8£420 #triptotal of #food daje £20.50average of #food daje £10.25count of #food daje 2min of #food daje £8.00max of #food daje £12.50#food total daje £20.50Food this week: sum of #food daje £20.50eaten = avg #food daje £10.25Tak 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:
£20 shop #food daje £20.00£30 meal out #food daje £30.00total of #food - £10 daje £40.002 * total of #food daje £100.00Cooking kit: total of #food daje £50.00Wiersz 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:
£50 dinner #trip #food daje £50.00£30 taxi #trip daje £30.00£9 sandwich #food daje £9.00total of #trip daje £80.00total of #food daje £59.00total of #trip #food daje £50.00Zakres 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:
# Week 1£20 lunch #food daje £20.00total of #food daje £20.00# Week 2£30 lunch #food daje £30.00total of #food daje £30.00Jeś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:
£12.50 lunch #food daje £12.50total of #drinks daje Unsupported: no lines tagged #drinks abovering the plumber #jobstotal of #jobs daje Unsupported: no amounts tagged #jobs aboveZapisywanie 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:
£20 flight #trip/lisbon daje £20.00£35 hotel #Trip/Lisbon daje £35.00total 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 |
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ę:
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 3average(filter(s >= 80, s, scores)) daje 88filter(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:
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.50Wybrana nazwa istnieje tylko w wywołaniu. Nie zmienia wartości o tej samej nazwie w innym miejscu notatki:
x = 10map(x * 2, x, [1, 2, 3]) daje [2, 4, 6]x daje 10Warunek 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:
[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 truePierwszy 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żyjmap(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żyjdot:dot([2, 3, 1], [4, 5, 10])daje33, 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:
# 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:
# Steps, Monday to Sundaysteps = [8200, 10400, 6300, 12000, 9100, 7400, 9600]goal = 9000sum(steps) daje 63,000average(steps) daje 9,000median(steps) daje 9,100Days on target: count(filter(s >= goal, s, steps)) daje 4Spread: max(steps) - min(steps) daje 5,700# Roughly 0.75 m per stepwalked = sum(steps) * 0.75 mwalked 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ą.