목록과 통계
목록은 일주일 동안의 걸음 수, 시험 점수 묶음, 한 달 치 영수증처럼 여러 값을 하나의 이름 아래 모아 둬요. 값을 목록에 넣고 나면 합계와 평균을 내고, 값이 얼마나 퍼져 있는지 재고, 중요한 값만 골라낼 수 있어요.
이 페이지에서는 목록을 쓰고 인덱스로 값을 꺼내는 방법, 요약 통계, 정렬과 자르기, map과
filter로 목록 변환하기, 목록 전체에 대한 산술 연산을 다뤄요. 요약할 숫자 열이 있을 때마다
참고하세요. 행으로 이루어진 목록은 행렬로도 쓸 수 있으며, 행렬은
별도 페이지에서 다뤄요.
목록 쓰기
값을 쉼표로 구분해서 대괄호 안에 넣으세요.
점수 = [72, 85, 91, 64, 88] 결과 [72, 85, 91, 64, 88]점수[0] 결과 72점수[4] 결과 88length(점수) 결과 5목록에서 값의 위치를 인덱스라고 하며, 목록 뒤에 대괄호로 써요.
인덱스는 0부터 시작하므로 점수[0]은 첫 번째 점수이고 점수[4]는 다섯 번째 점수예요. 마지막
요소는 항상 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]이 [3, 4]를 선택하고, 이어서 [0]이 3을 선택해요.
목록 안에서도 천 단위 구분 기호를 쓸 수 있으므로 숫자를 적힌 그대로 붙여 넣어도 돼요. 값 사이의 쉼표 뒤에는 공백을 넣으세요. 쉼표 뒤에 세 자리 숫자가 오면 같은 숫자의 일부로 읽혀요.
연봉 = [£32,000, £41,500, £38,250] 결과 [£32,000.00, £41,500.00, £38,250.00]average(연봉) 결과 £37,250.00주의할 점:
- 공백이 없으면 쉼표마다 값이 나뉘므로
[8200,10400]은 값이 두 개예요.[100,200,300]같은 목록은 숫자 하나로도 세 개로도 읽을 수 있으므로, Varlig는 두 가지 경우를 모두 알려 주는 오류를 표시해요. - 결과에는 천 단위 구분 기호와 쉼표 뒤의 공백이 표시되므로
[8,200, 10,400]은 값이 두 개인 목록이에요. - 목록에는 값을 최대 1,024개까지 넣을 수 있어요.
요약 통계
점수 = [72, 85, 91, 64, 88]sum(점수) 결과 400average(점수) 결과 80median(점수) 결과 85min(점수) 결과 64max(점수) 결과 91count(점수) 결과 5mean과 avg는 average의, total은 sum의, stdev는 stddev의, count는 length의
다른 이름이라서 스프레드시트에서 쓰던 습관을 그대로 쓸 수 있어요. product는 값을 모두 곱해요.
백분위수 함수는 없으며, median은 가운데 값을 구해요.
이름을 붙인 목록이라면 통계를 말로 쓸 수도 있어요.
점수 = [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) 결과 91average of 70, 85, 91 결과 82mean of (1,2,3) 결과 2average(1,200, 1,800) 결과 1,500위쪽 줄 합산하기
sum이나 total만 적힌 줄은 그 위의 결과를 바로 앞의 sum이나 total 줄, 또는 --- 구분선까지
거슬러 올라가며 더해요. 줄의 단축 메뉴에
있는 Subtotal 옵션처럼 동작하므로, 입력하는 동안 메모의 구역마다 합계가 따로 나와요.
# 장보기빵 = £1.20우유 = £1.45달걀 = £2.30total 결과 £4.95# 생활용품쓰레기봉투 = £3.50주방 세제 = £1.80total 결과 £5.30값에 sum이나 total이라는 이름을 붙였다면 그 줄에는 내 값이 표시돼요.
퍼짐 정도: 분산과 표준편차
점수 = [72, 85, 91, 64, 88]variance(점수) 결과 132.5stddev(점수) to 1 dp 결과 11.5둘 다 표본 통계예요. 값 개수보다 하나 적은 수(n - 1)로 나누는데, 가진 수치가 더 큰
집단에서 뽑은 표본일 때 흔히 쓰는 방식이에요. 값이 최소 두 개 있어야 해요. 어떤 통계든
반올림하려면 뒤에 to 1 dp를 붙이세요.
목록이 모집단 전체라면 대신 n으로 나눠야 해요. 아래에서 설명하는
map으로 직접 계산하세요.
# 열차 지연 시간(분)지연 = [2, 4, 4, 4, 5, 5, 7, 9]stddev(지연) 결과 2.1380899353중심 = average(지연) 결과 5sqrt(sum(map((x - 중심)^2, x, 지연)) / count(지연)) 결과 2단위가 있는 목록
sum, average, median, min, max, stddev는 단위를 유지하고, 호환되는 단위끼리는
변환해요.
통근 = [24 min, 31 min, 27 min, 22 min]sum(통근) 결과 104 minaverage(통근) 결과 26 minmedian(통근) 결과 25.5 minsum([1 kg, 500 g]) 결과 1.5 kgvariance는 결과가 단위의 제곱이 되기 때문에 일반 숫자만 받아요. sort도 일반 숫자에만
작동해요. sum([1 kg, 3 m])처럼 호환되지 않는 단위의 값에 통계를 적용하면 값을 조용히 건너뛰지
않고 오류를 표시해요.
빈 목록
| 빈 목록에 대한 호출 | 결과 |
|---|---|
sum([]) |
0 |
product([]) |
1 |
count([]), length([]) |
0 |
average([]), median([]), min([]), max([]) |
오류 |
variance([]), stddev([]) |
오류 |
빈 목록은 대개 아무것도 걸러지지 않은 filter의 결과로 생겨요. 그래서 원래 목록에 값이 있어도
걸러 낸 목록의 average는 실패할 수 있어요.
목록 함수 참조
| 호출 | 하는 일 |
|---|---|
range(start,end) |
start부터 end까지의 정수(양 끝 포함) |
range(start,end,step) |
step씩 세기(음수나 소수는 되지만 0은 안 됨) |
length(list), count(list) |
값의 개수 |
sort(list) |
작은 값부터 큰 값 순으로 정렬(일반 숫자만) |
reverse(list) |
같은 값을 역순으로(어떤 값이든 가능) |
unique(list) |
각 값이 처음 나온 것만 남기기 |
slice(list,start,end) |
인덱스 start부터 인덱스 end 직전까지의 값 |
map(expression,variable,list) |
각 값마다 식을 한 번씩 계산 |
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)은 가장 낮은 세 값을 골라요.
자르기 범위는 0 <= start <= end <= length를 만족해야 해요. start와 end가 같으면 빈 목록이
나와요. 점수[0:2] 같은 줄임 표기는 없으니 slice(점수, 0, 2)로 쓰세요.
unique는 저장된 값 그대로 비교하므로 1 kg과 1000 g은 서로 다른 값으로 취급하고, 소수
열째 자리에서 차이 나는 두 결과도 합치지 않아요.
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를 적용하면
빈 목록이 나와요.
목록 산술 연산
모든 값에 숫자 하나를 곱하거나 나눌 수 있고, 길이가 같은 두 목록은 값끼리 짝지어 더하거나 뺄 수 있어요.
[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] 결과 true첫 줄은 40점 만점 점수를 퍼센트로 바꿔요. 기말고사 - 모의고사 줄은 학생마다 모의고사 점수와
기말고사 점수를 짝지어 계산해요.
목록에서 지원하지 않는 연산도 있어요.
점수 + 5처럼 목록에 숫자 하나를 더하기. 대신map(s + 5, s, 점수)를 사용하세요.- 길이가 다른 목록끼리 더하기. 길이를 맞추기 위해 값을 반복하지는 않아요.
- 평평한 목록 두 개를
*로 곱하기. 짝지은 값끼리 곱해서 더하려면dot을 사용하세요. 예를 들어dot([2, 3, 1], [4, 5, 10])은33으로, 4짜리 커피 두 잔, 5짜리 차 세 잔, 10짜리 케이크 하나를 계산한 값이에요. 행으로 이루어진 목록 사이에서*는 행렬 곱셈이며, 벡터와 행렬에서 다뤄요.
행으로 이루어진 목록
행으로 이루어진 목록은 작은 표처럼 작동해요. average와 sum은 열 방향으로 계산하고, map으로는
행마다 계산할 수 있어요.
# 각 행은 학생 한 명: [모의고사, 기말고사]성적 = [[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을
적용하거나, 열 하나를 별도의 목록으로 꺼내세요.
이 모든 연산의 정확한 규칙은 고급 수학 참조에 있어요.
종합해 보기
시계에 기록된 일주일 동안의 걸음 수와 하루 목표예요.
# 월요일부터 일요일까지의 걸음 수걸음 수 = [8200, 10400, 6300, 12000, 9100, 7400, 9600]목표 = 9000sum(걸음 수) 결과 63,000average(걸음 수) 결과 9,000median(걸음 수) 결과 9,100목표 달성일: count(filter(s >= 목표, s, 걸음 수)) 결과 4최고와 최저의 차이: max(걸음 수) - min(걸음 수) 결과 5,700# 한 걸음에 약 0.75m걸은 거리 = sum(걸음 수) * 0.75 m걸은 거리 in km 결과 47.25 km평균은 목표와 정확히 같지만 목표를 달성한 날은 나흘뿐이고, 가장 많이 걸은 날과 가장 적게 걸은 날의
차이는 5,700걸음이에요. 목표를 바꾸거나 다음 주 걸음 수를 붙여 넣으면 모든 줄이
업데이트돼요.