Repository navigation
Expand file tree
/
Copy pathtest1.py
More file actions
82 lines (66 loc) · 2.04 KB
/
Copy pathtest1.py
File metadata and controls
82 lines (66 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
'''''
문제. data/scores.csv 를 읽어 아래를 구하고 output/result.csv 로 저장하세요
1. 학생별 총점·평균·학점 (step06_function/test1.py 의 학점 규칙)
2. 반(학년-반)별 평균
3. 과목 하나라도 50점 미만인 학생 = 과락
--출력--
과락 : ['최길동', '강길동']
1-1반 평균 83.16
1-2반 평균 66.00
2-1반 평균 75.33
2-2반 평균 68.16
3-1반 평균 81.83
3-2반 평균 69.50
result.csv 저장 완료 (12명)
'''''
import csv
SUBJECTS = ['국어', '영어', '수학']
def grade(avg):
"""평균을 학점으로."""
if avg >= 90:
return 'A'
elif avg >= 80:
return 'B'
elif avg >= 70:
return 'C'
elif avg >= 60:
return 'D'
return 'F'
def load(path):
"""CSV 를 읽어 숫자로 변환한 딕셔너리 목록을 돌려준다."""
with open(path, 'r', encoding='utf-8') as f:
raw = list(csv.DictReader(f))
rows = []
for r in raw:
scores = {sub: int(r[sub]) for sub in SUBJECTS}
total = sum(scores.values())
avg = round(total / len(SUBJECTS), 2)
rows.append({
'이름': r['이름'],
'학년': int(r['학년']),
'반': int(r['반']),
**scores,
'총점': total,
'평균': avg,
'학점': grade(avg),
})
return rows
rows = load('data/scores.csv')
# 1. 과락
fail = [r['이름'] for r in rows if any(r[sub] < 50 for sub in SUBJECTS)]
print('과락 :', fail)
# 2. 반별 평균
by_class = {}
for r in rows:
key = f"{r['학년']}-{r['반']}"
by_class.setdefault(key, []).append(r['평균'])
for key in sorted(by_class):
avgs = by_class[key]
print(f'{key}반 평균 {sum(avgs)/len(avgs):.2f}')
# 3. 저장
fields = ['이름', '학년', '반'] + SUBJECTS + ['총점', '평균', '학점']
with open('output/result.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
print(f'result.csv 저장 완료 ({len(rows)}명)')