リストと統計
リストは、1週間分の歩数、試験の点数、1か月分のレシートなど、複数の値を1つの名前でまとめて保持します。値をリストに入れておけば、合計や平均を求めたり、ばらつきを測ったり、必要な値だけを取り出したりできます。
このページでは、リストの書き方とインデックス、要約統計量、上の行の合計、離れた行でもまとめて合計できるタグでの目印付け、並べ替えと切り出し、map と filter によるリストの変換、リスト全体での演算を説明します。まとめたい数値の列があるときにいつでも役立ちます。行のリストは行列としても扱えます。行列については専用のページがあります。
リストの書き方
値を角かっこで囲み、カンマで区切ります。
点数 = [72, 85, 91, 64, 88] 答え [72, 85, 91, 64, 88]点数[0] 答え 72点数[4] 答え 88length(点数) 答え 5リストの中での値の位置をインデックスといい、リストの後に角かっこで書きます。インデックスはゼロから始まる ので、点数[0] は1つ目の点数、点数[4] は5つ目の点数です。最後の要素は常に length(点数) - 1 にあります。負の数、小数、大きすぎるインデックスはエラーになります。インデックスが末尾から折り返すことはありません。
要素には、計算式、単位付きの量、ほかのリストを使えます。
[2 * 45, 60 + 15] 答え [90, 75][1.5 kg, 750 g] 答え [1.5 kg, 750 g][[1, 2], [3, 4]][1][0] 答え 3入れ子のリストでは、1つ目のインデックスで内側のリストを選び、2つ目のインデックスでその中の値を選びます。[1] で [3, 4] が選ばれ、次に [0] で 3 が選ばれます。
リストの中でも桁区切りを使えるので、数値を書かれたとおりに貼り付けられます。値と値の間のカンマの後にはスペースを入れてください。カンマの後に3桁の数字が続く場合は、数値の一部として扱われます。
給与 = [£32,000, £41,500, £38,250] 答え [£32,000.00, £41,500.00, £38,250.00]average(給与) 答え £37,250.00いくつか注意点があります。
- スペースを入れないと、すべてのカンマが区切りになるので、
[8200,10400]は2つの値になります。[100,200,300]のようなリストは1つの数値とも3つの数値とも読めるので、Varligは両方の書き方を示すエラーを表示します。 - 答えには桁区切りと、各カンマの後のスペースが表示されるので、
[8,200, 10,400]は2つの値からなるリストです。 - 1つのリストに入れられる値は最大1,024個です。
要約統計量
点数 = [72, 85, 91, 64, 88]sum(点数) 答え 400average(点数) 答え 80median(点数) 答え 85min(点数) 答え 64max(点数) 答え 91count(点数) 答え 5mean と avg は average の、total は sum の、stdev は stddev の、count は length の別名なので、表計算アプリでの書き方をそのまま使えます。product は値をすべて掛け合わせます。最も多い値、パーセンタイル、四分位数については、この下を参照してください。
名前を付けたリストなら、統計量を言葉で書くこともできます。
点数 = [72, 85, 91, 64, 88]average of 点数 答え 80total of 点数 答え 400sum of、mean of、median of、min of、max of、count of も同じように使えます。of の後には、名前を書くか、値そのものをカンマで区切って書きます。値は丸かっこで囲んでも囲まなくてもかまいません。角かっこで囲んだ値には、average([72, 85, 91]) のように関数の形を使います。
sum、product、average、median、min、max、count、stddev など、ほとんどの統計量はリストの代わりに個別の値も受け付けます。
max(72, 85, 91) 答え 91sum(1, 2, 3, 4) 答え 10average of 70, 85, 91 答え 82mean of (1,2,3) 答え 2average(1,200, 1,800) 答え 1,500上の行を合計する
sum、total、subtotal、grand total、average、max、min とだけ書いた行は、その上にある答えからその値を計算します。対象はその行が属するセクションで、直前の合計行、--- の区切り線、# の見出しから始まります。そのため、入力するそばから、ノートの部分ごとに数値が出ます。行のコンテキストメニューにある 小計 オプションと同じ働きです。
# 食料品パン = £1.20牛乳 = £1.45卵 = £2.30total 答え £4.95# 日用品ゴミ袋 = £3.50食器用洗剤 = £1.80total 答え £5.30この語には、見出しを付けたり、名前を付けたり、答えを換算したり、後ろにコメントを書いたりできるので、ノートのほかの行と同じように読める文が書けます。
チケット = £64電車 = £41.20見込み合計: total 答え £105.20見込み = total と書けばその数値に名前が付き、total // 未予約分あり と書けば横にメモを添えられます。total in kg は表示する前に換算するので、グラムとキログラムが混ざったセクションで便利です。演算子の隣に置いた統計の語は、その語だけの行が示す数値と同じなので、£5 + subtotal は累計に£5を足します。
# 荷物12 kg 答え 12 kg4 kg 答え 4 kg850 g 答え 850 gtotal in kg 答え 16.85 kgmax 答え 12 kgsum や total という名前の値を自分で定義している場合は、その行には自分の値が表示されます。上に対象となるものが何もない場合は、空欄やゼロを表示するのではなく、Unsupported: no amounts above to add up と表示されます。たいていは、忘れていた見出しがあることを意味します。
金額は1回だけ数えられます。セクションの後のほうの行が、名前を付けた金額から何かを計算している場合、合計は両方ではなくその行のほうを数えます。そのため、単価と数量を並べた買い物リストは、実際に支払う額になります。
シャツ = £18.50ショートパンツ = £99 * シャツ 答え £166.5010 * ショートパンツ 答え £90.00手数料 = £40消費税 = 手数料 * 20% 答え £8.00total 答え £304.50シャツ と ショートパンツ は、それらを使う2つの行の中で数えられます。消費税 は 手数料 の一部を取っているだけなので、手数料 は合計に残ります。
これは名前のつながりをどこまでもたどります。ある金額を分け合い、その取り分を足し戻しているノートでは、足し戻した行と、元の金額の両方が数えられます。
賞金総額 = £900賞金1 = 50% of 賞金総額 答え £450.00賞金2 = 30% of 賞金総額 答え £270.00賞金3 = 20% of 賞金総額 答え £180.00賞金1 + 賞金2 + 賞金3 答え £900.00total 答え £900.00足されるのは同じ種類の金額だけです。上にお金や量があるとき、パーセント、単価、ただの個数は除外され、エラーのある行も除外されます。列に貼り付けたただの数値は、ほかの金額と同じように小数点以下2桁まで書かれていれば足されます。為替レートや倍率のように小数の桁数が多いものは除外されます。合計のヒントには、除外したものが「Leaves out line 3 (people = 2)」「Leaves out line 2 (an error)」のように示されるので、その数値に何が入っているかがひと目でわかります。
名前から計算した行の下に、名前を付けずに2つ以上の金額を並べ、その直上に合計行を置いた場合は、その並びだけが合計されます。ノートの上のほうで求めた予算が、下の一覧でもう一度数えられることはありません。
予算 = £18,000残り = 予算 - £6,388.25 答え £11,611.75- ゴミ回収 £250 答え £250.00- ハウスクリーニング £120 答え £120.00subtotal 答え £370.00隣り合っていない行をまとめて合計するには、代わりにタグで目印を付けます。
最も多く出てくる値
mode は、ほかのどの値よりも多く出てくる値を返します。modes は、最も多いところで並んだ値をすべてリストで返します。
評点 = [3, 4, 4, 5, 5, 5, 6]mode(評点) 答え 5modes([1, 1, 2, 2, 3]) 答え [1, 2]mode が答えるのは、1つの値がはっきりと最も多いときだけです。同じ値が1つも繰り返されない場合や、複数の値が並んだ場合は、どれかを選ぶのではなくそう伝えます。
mode([1, 2, 3]) 答え Unsupported: No value repeats, so this list has no mode; use median or average insteadパーセンタイルと四分位数
percentile(list, rank) は0から100までの順位を受け取り、その位置にある値を、最も近い2つの観測値の間を補間して返します。quartile(list, k) はそれを4分の1刻みにしたもので、k は0から4です。つまり quartile(list, 1) は percentile(list, 25) と同じです。
点数 = [72, 85, 91, 64, 88]percentile(点数, 50) 答え 85percentile(点数, 25) 答え 72quartile(点数, 3) 答え 88quartile(点数, 4) 答え 91percentile([1, 2, 3, 4], 25) 答え 1.75quartile([1, 2, 3, 4], 3) 答え 3.2550パーセンタイルは中央値です。0パーセンタイルと100パーセンタイル、つまり quartile(list, 0) と quartile(list, 4) は最小値と最大値で、min や max と同じです。範囲を外れた順位は、収まる一番近い値に直されるのではなくエラーになります。
percentile([1, 2, 3, 4], 101) 答え Unsupported: A percentile is between 0 and 100quartile([1, 2, 3, 4], 5) 答え Unsupported: A quartile is 0, 1, 2, 3 or 4ばらつき:分散と標準偏差
点数 = [72, 85, 91, 64, 88]variance(点数) 答え 132.5stddev(点数) to 1 dp 答え 11.5どちらも 標本 統計量です。値の個数より1少ない数(n - 1)で割ります。手元の数値がより大きな集団からの標本である場合に一般的に使われる方法です。値が少なくとも2つ必要です。どの統計量でも、後に to 1 dp を付けると丸められます。
リストが標本ではなく母集団全体の場合は、母集団用の関数を使います。こちらは n で割り、必要な値は1つだけです。
# 電車の遅延(分)遅延 = [2, 4, 4, 4, 5, 5, 7, 9]sample_variance(遅延) 答え 4.5714285714population_variance(遅延) 答え 4sample_stddev(遅延) 答え 2.1380899353population_stddev(遅延) 答え 2| 呼び出し | 差の2乗を割る数 | 必要な値 |
|---|---|---|
variance、sample_variance |
n - 1 |
2つ |
population_variance |
n |
1つ |
stddev、stdev、sample_stddev |
n - 1 |
2つ |
population_stddev |
n |
1つ |
sample_variance と sample_stddev は variance と stddev の長い名前なので、どちらのつもりかをはっきり書けます。短い名前は以前から標本のほうで、今もそのままです。
単位付きのリスト
sum、average、median、mode、modes、percentile、quartile、min、max、stddev、population_stddev は単位を保持し、互換性のある単位の間で換算します。値は1つ目の単位で読まれ、答えもその単位で返ります。
通勤時間 = [24 min, 31 min, 27 min, 22 min]sum(通勤時間) 答え 1 hour 44 minaverage(通勤時間) 答え 26 minmedian(通勤時間) 答え 25.5 minpercentile(通勤時間, 25) 答え 23.5 minpopulation_stddev(通勤時間) 答え 3.3911649916 minsum([1 kg, 500 g]) 答え 1.5 kgmodes([1 kg, 500 g, 1 kg, 500 g]) 答え [0.5 kg, 1 kg]例外は分散です。観測値を2乗するため、単位はそこで失われます。そのため、ただの数値しか受け付けません。
sample_variance([1 kg, 2 kg]) 答え Unsupported: A variance squares its observations, so it takes plain numbers; use stddev for amounts with a unitsort もただの数値でしか使えません。sum([1 kg, 3 m]) のように互換性のない単位を持つ値に統計量を使うと、値を黙って飛ばすのではなくエラーになります。
これらの背後にある厳密さの規則は、エンジンが保証することにあります。
空のリスト
| 空のリストに対する呼び出し | 結果 |
|---|---|
sum([]) |
0 |
product([]) |
1 |
count([]), length([]) |
0 |
average([]), median([]), min([]), max([]) |
エラー |
variance([]), stddev([]) |
エラー |
空のリストは、何にも一致しなかった filter の結果として現れることがほとんどです。そのため、元のリストに値があっても、絞り込んだリストの average が失敗することがあります。
タグ
タグは、# に語を直接つなげたものです。#食費 のように書きます。行のどこに書いても、その行の目印になります。タグ自体は計算に加わらないので、行はこれまでどおり自分の答えを表示し、同じタグの付いたほかの行と1つのまとまりになります。total of #食費 と書けば、その行だけが合計されます。
£12.50 lunch #食費 答え £12.50£8 coffee #食費 答え £8.00航空券 = £420 #旅行 答え £420.00total of #食費 答え £20.50小計にはできないことがここにあります。対象の行が隣り合っている必要がないのです。1週間の支出、旅行、買い物リストを1つのブロックに書いても、それぞれの数値が下に出ます。タグにポインタを合わせると、そこまでの合計を確かめられます。
どの統計量もタグに使えます。of は省略でき、タグは語の前にも後ろにも置け、答えにはほかの行と同じように見出しや名前を付けられます。
#食費 £12.50#食費 £8£420 #旅行total of #食費 答え £20.50average of #食費 答え £10.25count of #食費 答え 2min of #食費 答え £8.00max of #食費 答え £12.50#食費 total 答え £20.50今週の食費: sum of #食費 答え £20.50外食 = avg #食費 答え £10.25sum、total、average、avg、mean、count、min、max はどれもこの形で読まれます。
タグの統計量は金額と同じ位置に置けるので、そこから計算を続けられます。累計から頭金を引いたり、何倍かしたり、2つのタグを突き合わせたりできます。
£20 shop #食費 答え £20.00£30 meal out #食費 答え £30.00total of #食費 - £10 答え £40.002 * total of #食費 答え £100.00調理道具: total of #食費 答え £50.001つの行にはいくつでもタグを付けられ、そのすべてがその行を数えます。1つのフレーズに2つのタグを並べると、両方が付いた行だけが対象になります。
£50 dinner #旅行 #食費 答え £50.00£30 taxi #旅行 答え £30.00£9 sandwich #食費 答え £9.00total of #旅行 答え £80.00total of #食費 答え £59.00total of #旅行 #食費 答え £50.00タグの合計が見る範囲
タグのフレーズが見る範囲は、total だけを書いた行とまったく同じで、規則も同じです。
- 対象はその行が属するセクションで、直前の合計行、
---の区切り線、#の見出しまでさかのぼります。 - 足されるのは同じ種類の金額だけです。パーセント、単価、ただの個数、エラーのある行は除外され、「Leaves out line 2 (people = 2)」のようにヒントに示されます。
- 金額は1回だけ数えられます。タグの付いた単価を、後のタグ付きの行が掛け算している場合は、両方ではなくその行のほうで数えられます。
そのため、見出しを1つ入れるだけで、ある週の #食費 を次の週と切り離せます。
# 1週目£20 lunch #食費 答え £20.00total of #食費 答え £20.00# 2週目£30 lunch #食費 答え £30.00total of #食費 答え £30.00合計するものが何もない場合は、空欄やゼロではなくそのことが表示されます。たいていはタグの打ち間違いか、忘れていた見出しがあることを意味します。
£12.50 lunch #食費 答え £12.50total of #飲み物 答え Unsupported: no lines tagged #飲み物 above水道屋に電話 #用事total of #用事 答え Unsupported: no amounts tagged #用事 aboveタグ名の書き方
タグ名には文字、数字、_、-、/ を使えるので、#q1-2026 も #旅行/リスボン もそれぞれ1つの名前です。英字の大文字と小文字は区別されません。
£20 flight #trip/lisbon 答え £20.00£35 hotel #Trip/Lisbon 答え £35.00total of #trip/lisbon 答え £55.00語につながっていない # はこれまでどおりの意味なので、すでに書いているものが変わることはありません。
| 入力 | 意味 |
|---|---|
# 今週の買い物 |
コメント。ハッシュの後にスペースがあるため |
5 + 5 # コメント |
同じく、ハッシュより後は無視されます |
C#4 in Hz |
音楽のシャープ。ハッシュが音名につながっているため |
#1, 請求書 #123 |
タグではなく番号。タグ名は数字で始められません |
#ff0000, #fff |
カラーコード |
varlig.app/docs#tags |
断片識別子の付いたWebアドレス |
タグ名は文字で始まる必要があり、ハッシュのあとの16進数3桁、4桁、6桁、8桁はカラーコードとして読まれます。そのため、#fee はカラーコード、#fees はタグです。
ノートのタグと計算ブロックのタグ
サイドバーでノートを整理するタグについては、タグ、リンク、バックリンクで説明しています。そちらのタグは計算ブロックの外までです。ブロックの中に書いた #食費 はその行の合計のための目印で、サイドバーには現れません。ブロックの外、ノート本文の #食費 はノートを分類するだけで、計算には影響しません。両方が必要なときは、両方に書いてください。なお、1点だけ違いがあります。ノートのタグは2つ目の # で閉じればスペースを含められますが、計算ブロックのタグは最初のスペースで必ず終わります。
リスト関数一覧
| 呼び出し | 機能 |
|---|---|
range(start,end) |
start から end までの整数(両端を含む) |
range(start,end,step) |
step ずつ数える(負の数や小数も可、ゼロは不可) |
length(list), count(list) |
値の個数 |
sort(list) |
小さい順に並べる(ただの数値のみ) |
reverse(list) |
同じ値を逆順にする(どんな値でも可) |
unique(list) |
各値の最初の出現だけを残す |
slice(list,start,end) |
インデックス start から end の手前までの値 |
map(expression,variable,list) |
値ごとに式を1回ずつ計算する |
filter(condition,variable,list) |
条件が true になる値だけを残す |
range(1, 5) 答え [1, 2, 3, 4, 5]range(0, 100, 25) 答え [0, 25, 50, 75, 100]range(10, 0, -2) 答え [10, 8, 6, 4, 2, 0]点数 = [72, 85, 91, 64, 88]sort(点数) 答え [64, 72, 85, 88, 91]reverse(sort(点数)) 答え [91, 88, 85, 72, 64]slice(sort(点数), 0, 3) 答え [64, 72, 85]unique([4, 2, 4, 6, 2]) 答え [4, 2, 6]reverse(sort(…)) は大きい順に並べ、slice(sort(…), 0, 3) は小さいほうから3つを取り出します。
切り出しの範囲は 0 <= start <= end <= length を満たす必要があります。start と end が等しいと空のリストになります。点数[0:2] のような省略形はないので、slice(点数, 0, 2) と書いてください。
unique は保存されているとおりに値を比較するので、1 kg と 1000 g は別の値として数えられ、小数点以下10桁目が異なる2つの結果もまとめられません。
mapとfilter
map はリストの値ごとに式を計算します。filter は条件を満たす値だけを残します。どちらも、式、各値を表す名前、リストの順に書きます。
点数 = [72, 85, 91, 64, 88]map(s + 5, s, 点数) 答え [77, 90, 96, 69, 93]filter(s >= 80, s, 点数) 答え [85, 91, 88]count(filter(s >= 80, s, 点数)) 答え 3average(filter(s >= 80, s, 点数)) 答え 88filter(s >= 80, s, 点数) は、「点数 の値 s のうち s >= 80 であるもの」と読みます。どちらも単位やお金と一緒に使えます。
map(p * 1.2, p, [£10, £25, £40]) 答え [£12.00, £30.00, £48.00]支出 = [£42.50, £18.20, £65.00, £23.30]filter(x > £30, x, 支出) 答え [£42.50, £65.00]sum(filter(x > £30, x, 支出)) 答え £107.50ここで選んだ名前は、その呼び出しの中にだけ存在します。ノートのほかの場所にある同じ名前の値は変わりません。
x = 10map(x * 2, x, [1, 2, 3]) 答え [2, 4, 6]x 答え 10filter の条件は、比較またはそのほかの真偽値でなければなりません。ただの数値は真として扱われないので、filter(x, x, [0, 1, 2]) はエラーになります。空のリストに map や filter を使うと、空のリストが返ります。
リストの演算
すべての値に1つの数値を掛けたり、1つの数値で割ったりできます。また、同じ長さの2つのリストを値ごとに足したり引いたりできます。
[30, 36, 22] / 40 * 100 答え [75, 90, 55]2 * [3, 1, 4] 答え [6, 2, 8]-[5, -3] 答え [-5, 3]模試 = [62, 70, 60]本試験 = [72, 78, 69]本試験 - 模試 答え [10, 8, 9]average(本試験 - 模試) 答え 9[1 kg, 2 kg] + [500 g, 500 g] 答え [1.5 kg, 2.5 kg][72, 85] == [72, 85] 答え true1行目は40点満点の点数をパーセントに変換しています。本試験 - 模試 の行は、生徒ごとに模試の点数と本試験の点数を組み合わせています。
リストでは使えない演算もあります。
点数 + 5のように、リストに1つの数値を足すこと。代わりにmap(s + 5, s, 点数)を使います。- 長さの異なるリストを足すこと。長さをそろえるために値が繰り返されることはありません。
- 2つの平らなリストを
*で掛けること。組ごとの積の合計にはdotを使います。たとえば、4のコーヒーが2杯、5の紅茶が3杯、10のケーキが1つなら、dot([2, 3, 1], [4, 5, 10])で33です。行のリスト同士では*は行列の積になります。これについてはベクトルと行列で説明しています。
行のリスト
行のリストは小さな表のように使えます。average と sum は列ごとに計算し、map を使えば行ごとに計算できます。
# 各行が生徒1人分:[模試, 本試験]成績 = [[62, 72], [70, 78], [60, 69]]average(成績) 答え [64, 73]sum(成績) 答え [192, 219]map(average(r), r, 成績) 答え [67, 74, 64.5]median、min、max、stddev は行のリストを受け付けません。最後の行のように map で行ごとに処理するか、列を取り出して独立したリストにしてください。
これらすべての演算の正確な規則は、高度な数学:機能と制限にあります。
まとめて使う
スマートウォッチで記録した1週間分の歩数と、1日の目標です。
# 歩数(月曜〜日曜)歩数 = [8200, 10400, 6300, 12000, 9100, 7400, 9600]目標 = 9000sum(歩数) 答え 63,000average(歩数) 答え 9,000median(歩数) 答え 9,100目標達成日数: count(filter(s >= 目標, s, 歩数)) 答え 4ばらつき: max(歩数) - min(歩数) 答え 5,700# 1歩あたり約0.75 m歩いた距離 = sum(歩数) * 0.75 m歩いた距離 in km 答え 47.25 km平均はちょうど目標どおりですが、目標に達したのは4日だけで、最も多い日と少ない日の差は5,700歩あります。目標 を変えたり、翌週の歩数を貼り付けたりすれば、すべての行が更新されます。