CS/Python

[Python] 으뜸파이썬 6장 연습문제 20번 : list ➡ tuple, zip() 함수 활용

아이스얼그레이 2022. 4. 21. 13:01

문제

학생의 이름과 국어, 수학, 과학 성적을 입력받아 아래 문제의 답을 출력하는 프로그램을 작성하라.

1) 튜플을 언패킹하여 수학과 과학 성적만 추출한 뒤, 학생별 수학과 과학 성적의 평균을 구하는 코드를 작성하라.

2) 위 튜플에 대하여 학생의 이름과 국어, 수학, 과학 성적의 평균 점수를 student_dic이라는 딕셔너리 구조에 넣은 후 다음과 같이 이름과 평균 성적을 출력하라.

입력

이름과 국어, 수학, 과학 성적을 입력하세요 : 박동규 88 95 90 강영민 85 90 95 박동민 70 90 80 홍승주 90 90 95

출력

학생들의 수학과 과학 성적의 평균은 각각 91.66점, 88.33점 입니다.

이름         평균성적
박동규          91.00
강영민          90.00
박동민          80.00

홍승주          91.67

 

풀이

실습시간에 풀었던 문제인데, zip() 함수를 이해를 못해서 푸는데 한참 걸렸던 문제입니다. 풀고나니 간단해서 허탈했네요..ㅋㅋ 그냥 zip() 함수와 tuple 자료형을 다루는 연습을 하기위한 문제입니다.

입력을 처리하는 코드

scores = list(input("이름, 국어, 수학, 과학: ").split())
scores_tups = []

for i in range(len(scores)):
    if i % 4 != 0:
        scores[i] = int(scores[i])

for i in range(len(scores) // 4):
    scores_tups.append(tuple(scores[4 * i:4 * i + 4]))

입력을 리스트로 받기 때문에, 숫자도 문자열로 저장 됩니다. 그래서 문자열 숫자를 정수로 바꿔주는 작업이 필요합니다. 1, 2, 3번째 5, 6, 7번째 즉 4n + 1, 4n + 2, 4n + 3번째에 숫자가 입력됩니다. index가 4의 배수가 아닐 때 정수로 형변환 해줍니다. 그리고 입력 4개씩 tuple로 묶어서 새로운 리스트 scores_tups에 저장해줍니다.

 

언패킹을 통해 수학, 과학 성적을 처리하고, 이름 : 평균 딕셔너리를 만드는 코드

_, _, math, science = zip(*scores_tups)

print(f"학생들의 수학과 과학 성적의 평균은 각각 {sum(math) / len(math)}점, {sum(science) / len(science)}점 입니다.")

print("이름         평균성적")

student_dict = { name : (k + m + s) / 3 for name, k, m, s in scores_tups }

for key in student_dict:
    print(f"{key}{student_dict[key]:15.2f}")

scores_tup이 (name, k, m ,s) 형태로 저장되어있기 때문에 -, -, math, science를 쓰면 이름, 국어 성적을 무시하고 수학, 과학 성적만 뽑아줍니다. 그리고 zip(*scores_tups)를 통해 (name, k, m, s)가 여러 개 있는 데이터가 (name0, name1, name2, ···), (k0, k1, k2, ···), (m0, m1, m2, ···), (s0, s1, s2, ···)로 언패킹 됩니다.

 

마지막 딕셔너리를 만드는 코드는 축약된 for문을 이용해서 작성했습니다.