36차시. 평가 실습
퀴즈 2 — 그룹별 정답률과 표본 부족 표시
채점 결과 rows(각 항목에 type, difficulty, correct)를 key 값으로 묶어 그룹별 정답률 줄을 돌려주는 breakdown(rows, key, min_n=5) 를 만드세요. 표본이 min_n 건보다 적은 그룹에는 "판단 보류" 를 붙이세요.
빈칸 코드에서 시작합니다.
from collections import defaultdict
def breakdown(rows, key, min_n=5):
# key 값으로 묶고, 그룹마다 정답 수와 비율을 계산합니다
pass
결과 보기 (예시 풀이)
from collections import defaultdict
def breakdown(rows, key, min_n=5):
"""rows 를 key(예: difficulty, type) 값으로 묶어 정답률 줄을 만듭니다.
표본이 min_n 건보다 적은 그룹에는 '판단 보류' 를 붙입니다."""
groups = defaultdict(list)
for r in rows:
groups[r[key]].append(r)
lines = []
# 표본이 많은 그룹부터 보여 줍니다
for name, items in sorted(groups.items(), key=lambda p: -len(p[1])):
hit = sum(1 for i in items if i["correct"])
rate = hit / len(items) * 100
note = " (판단 보류: 표본 부족)" if len(items) < min_n else ""
lines.append(f"{name:<12} {hit:>2}/{len(items):<2} {rate:5.1f}%{note}")
return lines
# 가짜 채점 결과: 수업 자료의 type 별 결과(fact 11/11, compound 4/6, conditional 2/3)를 흉내 냅니다
rows = []
for t, ok, total in [("fact", 11, 11), ("compound", 4, 6), ("conditional", 2, 3)]:
for k in range(total):
rows.append({"type": t, "difficulty": "easy" if t == "fact" else "hard",
"correct": k < ok})
# 예시 1: 유형별. conditional 은 3건뿐이라 판단 보류가 붙어야 합니다
for line in breakdown(rows, "type"):
print(line)
print()
# 예시 2: 난이도별. 두 그룹 모두 5건 이상이라 보류 표시가 없어야 합니다
for line in breakdown(rows, "difficulty"):
print(line)
실행 결과
fact 11/11 100.0%
compound 4/6 66.7%
conditional 2/3 66.7% (판단 보류: 표본 부족)
easy 11/11 100.0%
hard 6/9 66.7%채점 기준: 그룹별 정답 수와 비율이 맞고, 표본이 min_n 건 미만인 그룹에만 판단 보류가 붙으면 정답입니다.