[목차]
파이썬 선택형 학습 세션 <문자열과 자료구조> "학습 내용" 및 "과제 정리"
파이썬 선택형 학습 세션 <문자열과 자료구조> "학습 내용" 및 "과제 정리"
cf) https://docs.python.org/ko/3.8/tutorial/index.html
파이썬 자습서 — Python 3.8.20 문서
파이썬 자습서 파이썬은 배우기 쉽고, 강력한 프로그래밍 언어입니다. 효율적인 자료 구조들과 객체 지향 프로그래밍에 대해 간단하고도 효과적인 접근법을 제공합니다. 우아한 문법과 동적 타
docs.python.org
※ 항상 공식 사이트의 Python 관련 설명 내용을 통해 추가적으로 확인하고자 하는 내용을 확인하기!
1. Python <문자열과 자료구조>부분 개인 정리
1.1. 개요 (이전까지의 내용 간단 정리)
- 중요! 변수에 어떠한 연산을 한 식을 담건, 특정 자료형을 담건 값을 할당하는 순간 그 값의 자료형이 변수에게 매겨진다! 즉,
text = "Python is a powerful programming language"
contains_python = "Python" in text
print ( type ( contains_python ))
<class 'str'>
<class 'bool'>
"""
즉, {text}는 문자형 자료형이지만 연산을 통해 할당된
{contains_python}은 boolean자료형이 된다.
"""
a. 표준 출력 : 원하는 내용을 내가 원하는 스타일로 프롬프트 창에 출력할 때 사용
b. 표준 입력 : 키보드로부터 문자열을 입력받아 변수로 값을 할당 할당된 값은 문자열로 입력 받기 때문에 차후 연산시 형변환이 중요
c. 조건문 : 조건식에 따라서 프로그램의 분기를 나누고 싶은 경우에 사용
- 비교 연산자, 논리 연산자, and, or, not 등의 기호를 사용할 수 있다.
- 0, 0.0, "", []는 조건문에서 False값을 갖는다.
- -100, "str()", " "는 조건문에서 True값을 갖는다.
d. 반복문 : 특정 프로그램 내용을 반복하고 싶을 경우에 사용
- 제어문
break : 반복문을 빠져나올 때 사용한다.
continue : 현재의 요소에 대하여 반복을 건너뛰고 다음 요소로 반복을 수행한다.
else : 반복문이 정상적으로 완료되었을 시 실행하는 구문이다. # break문으로 반복문을 빠져나올 시 else문은 실행되지 않는다.
e. 자료구조
- 기본 자료형 : 정수, 실수, 문자형, boolean, 등등이 있다.
- 기본 자료형 외 : 리스트(순서O, 값 변경 가능), 튜플(순서O, 값 변경 X), 셋(중복값 없음, 키를 통해 참조 가능, 순서가 없음), 딕셔너리(키와 벨류로 구성, 키를 통해 값을 참조 가능, 순서 없음[최근 버전에선 입력한 순서대로 출력함.]), 데이터 프레임(pandas를 통해 표현되는 2차원 형식의 리스트, 테이블 형태의 데이터), 클래스 등이 있다.
# 셋과 딕셔너리는 원래 인덱스 활용이 불가능하다.
1.2. 리스트 컴프리헨션(List Comprehension)
- 정의 : 오직 파이썬에서 지원하는 간결하고 효율적인 리스트 생성 기능
- 기본 형식 : 표현식 for 항목 in 반복가능객체
- 조건 추가 형식 : 표현식 for 항목 in 반복가능객체 if 조건
- 다중 for문 : 표현식 for 항목1 in 반복가능객체1 for 항목2 in 반복가능객체2
- 중요 : "조건문이 추가"되거나, "삼항연산자가 사용"되거나 "중첩반복문이 사용"되어 무엇이 우선 적용되어 리스트 생성되는지 혼동될 수 있음.
# 조건문 추가 (필터 기능능): [표현식 for 항목 in 반복가능객체 if 조건]
even_squares = [ x ** 2 for x in range ( 1 , 11 ) if x % 2 == 0 ]
print ( f "1부터 10까지 짝수의 제곱: { even_squares } " )
# [4, 16, 36, 64, 100]
"""
'for x in range(1, 11)'가 1순위로 작동하고
'if x % 2 == 0'가 2순위로 작동(필터링!)
'x**2'인 표현식이 3순위로 적용되어 리스트로 만들어진다.
"""
# 삼항 연산자 사용 (조건식)
values = [ x if x % 2 == 0 else - x for x in range ( 1 , 6 )]
print ( f "조건에 따른 값 변환: { values } " )
# [-1, 2, -3, 4, -5]
"""
'for x in range(1, 6)'가 1순위 작동
'x if x % 2 == 0 else -x'가 2순위 작동(삼항 연산자)하여
리스트가 만들어진다.
"""
1.3. 2차원 리스를 표로 표현하기
table = [
[ 85 , 82 , 88 , 30 ],
[ 92 , 95 , 90 , 98 ],
[ 78 , 85 , 92 , 86 ]
]
"""
table 내의 작은 리스트는 학생n의 성적list이고
작은리스트의 요소는 순서대로 '국어', '영어', '수학', '과학' 과목의 성적이다.
"""
# 학생별 평균 점수 # 행으로 접근한 뒤에 열로 접근
for row in range ( len ( table )) : # 학생별로 접근(행 별로 접근)
total_point = 0
for col in range ( len ( table [ 0 ])): # 학생 1명에 대한 처리 (열 별로 접근)
total_point += table [ row ][ col ]
print ( total_point / len ( table [ row ])) # end의 기본값은 \n 즉 줄바꿈임!
# 과목별 평균 점수 # 열로 접근한 뒤에 행으로 접근 그래
for col in range ( len ( table [ 0 ])): # 과목 수만큼 돌린다
sub_total = 0 # 과목별 점수 합계 구할 변수
for row in range ( len ( table )): # 학생 수만큼 돌린다
sub_total += table [ row ][ col ]
print ( sub_total / len ( table ))
#zip함수 : 여러 리스트의 값을 묶는데 같은 인덱스 끼리 묶는다
print ( list ( zip ( * table )))
for scores in list ( zip ( * table )) :
print ( sum ( scores ) / len ( scores ))
#list캄프리헨션
subject_avgs = [ sum ( scores ) / len ( scores ) for scores in zip ( * table )]
print ( subject_avgs )
"""학생별 평균 점수는 행에서 열로 반복문의 변수가 접근하고
과목별 평균 점수는 열에서 행으로 반복문 변수가 잡근한다."""
2. 문자열과 자료구조 과제 정리
# 문제 1: 문자열 조작 (String)
# 설명 : 텍스트 데이터를 분석하고 처리하는 능력을 테스트하는 문제입니다.
"""
**요구사항:**
- 주어진 문자열에서 각 알파벳의 빈도수를 세어 출력하세요.
- 대소문자를 구분하지 않고 모든 문자를 소문자로 처리합니다.
- 알파벳이 아닌 문자(공백, 숫자, 특수문자)는 무시합니다.
- 알파벳 순서대로 결과를 출력합니다.
"""
# 구현 코드
text1 = "Hello, World! Python Programming is Fun and Exciting 123." # 예시 문자열
text1_l = text1 . lower () # 모든 문자 소문자 처리
text1_l_list = text1_l . split ( ' ' ) # 공백 기준 단어 구분, 9개
text = '' . join ( text1_l_list ) # 모든 단어 결합
#print(len(text)) # 총 49개 (특수문자 포함)
alphabet = "abcdefghijklmnopqrstuvwxyz"
#print(len(alphabet)) # 알파벳의 총 개수 = 26
for num in range ( 0 , 25 ):
if text . count ( alphabet [ num ]) > 0 :
x = text . count ( alphabet [ num ])
print ( f " { alphabet [ num ] } : { x } " , end = ' ' )
# 프롬프트 출력
a: 2 c: 1 d: 2 e: 2 f: 1 g: 3 h: 2 i: 4 l: 3 m: 2 n: 5 o: 4 p: 2 r: 3 s: 1 t: 2 u: 1 w: 1 x: 1 y: 1
# 문제 2: 리스트 처리 (List)
# 설명 : 리스트 조작과 리스트 컴프리헨션 활용 능력을 테스트하는 문제입니다.
"""
**요구사항:**
- 주어진 학생들의 점수 리스트에서 다음 정보를 계산하여 출력하세요:
1. 전체 평균 점수
2. 80점 이상 받은 학생 수
3. 가장 높은 점수와 가장 낮은 점수의 차이
4. 점수를 5점 단위로 반올림한 리스트
5. 각 점수 구간(0-59, 60-69, 70-79, 80-89, 90-100)에 속하는 학생 수
"""
# 구현 코드
# 주어진 점수 리스트
scores = [ 78 , 91 , 84 , 66 , 88 , 73 , 58 , 95 , 82 , 79 , 65 , 92 , 88 , 74 , 77 ]
total_avg = sum ( scores ) / len ( scores )
print ( f " { total_avg :.2f} " ) # 전체 평균 점수
scores80 = []
for i in range ( 0 , len ( scores )):
if scores [ i ] >= 80 :
scores80 . append ( scores [ i ])
print ( len ( scores80 )) # 전체 15명 중에서 80점 이상 = 7명
print ( max ( scores ) - min ( scores )) # "최고점 - 최저점" = 37
score_roun = []
score = []
for i in range ( 0 , len ( scores )):
score . append ( round (( int ( scores [ i ]) * 0.1 ), 0 ) * 10 )
for i in range ( 0 , len ( score )):
if score [ i ] not in score_roun :
score_roun . append ( int ( score [ i ]))
print ( score_roun ) # 점수 5점단위 반올림 리스트
cnt_60_l = []
cnt_70_l = []
cnt_80_l = []
cnt_90_l = []
cnt_100_l = []
for i in range ( 0 , len ( scores )):
if scores [ i ] < 60 :
cnt_60_l . append ( scores [ i ])
elif scores [ i ] < 70 :
cnt_70_l . append ( scores [ i ])
elif scores [ i ] < 80 :
cnt_80_l . append ( scores [ i ])
elif scores [ i ] < 90 :
cnt_90_l . append ( scores [ i ])
else :
cnt_100_l . append ( scores [ i ])
print ( f "60점 미만의 학생수: " , len ( cnt_60_l ))
print ( f "60점 이상 70 미만의 학생수: " , len ( cnt_70_l ))
print ( f "70점 이상 80 미만의 학생수: " , len ( cnt_80_l ))
print ( f "80점 이상 90 미만의 학생수: " , len ( cnt_90_l ))
print ( f "90점 이상 100 미만의 학생수: " , len ( cnt_100_l )) # 각 점수별 학생 수
# 출력문
79.33
7
37
[80, 90, 70, 60, 100]
60점 미만의 학생수: 1
60점 이상 70 미만의 학생수: 2
70점 이상 80 미만의 학생수: 5
80점 이상 90 미만의 학생수: 4
90점 이상 100 미만의 학생수: 3
# 문제 3: 튜플 활용 (Tuple)
# 설명 : 튜플의 특성과 함수 반환값으로서의 활용을 테스트하는 문제입니다.
"""
요구사항:
- 사람들의 정보가 튜플 리스트로 주어집니다. 각 튜플은 (이름, 나이, 전공, 성적)으로 구성됩니다.
- 다음 정보를 계산하고 출력하세요:
1. 나이가 가장 많은 사람과 가장 적은 사람의 이름과 나이
2. 전공별 평균 성적 (전공별로 몇 명인지도 함께 출력)
3. 성적이 4.0 이상인 사람들의 이름과 전공
4. 모든 사람의 평균 나이
5. 성적순으로 정렬된 이름 목록
"""주어진 데이터:"""
students = [
( "김철수" , 21 , "컴퓨터공학" , 3.8 ),
( "이영희" , 23 , "경영학" , 4.2 ),
( "박민수" , 20 , "전자공학" , 4.1 ),
( "정지원" , 22 , "컴퓨터공학" , 3.9 ),
( "최유진" , 21 , "경영학" , 3.5 ),
( "강현우" , 24 , "전자공학" , 4.3 ),
( "장미영" , 22 , "컴퓨터공학" , 4.2 ),
( "윤태민" , 23 , "경영학" , 3.7 ),
( "한서연" , 20 , "전자공학" , 3.9 )
]
# 3-1 나이가 가장 많은 사람과 가장 적은 사람의 이름과 나이
name_age = []
for i in range ( 0 , len ( students )):
name_age . append ( students [ i ][ 0 : 2 ])
#print(name_age) # 이름과 나이 따로 리스트화
max_age = 0
max_name = []
min_age = 100
min_name_age = []
for i in range ( 0 , len ( name_age )):
if max_age < name_age [ i ][ 1 ]:
max_age = name_age [ i ][ 1 ]
for i in range ( 0 , len ( name_age )):
if max_age == name_age [ i ][ 1 ]:
print ( name_age [ i ]) # 연장자 이름과 나이
for j in range ( 0 , len ( name_age )):
if name_age [ j ][ 1 ] < min_age :
min_age = name_age [ j ][ 1 ]
for j in range ( 0 , len ( name_age )):
if name_age [ j ][ 1 ] == min_age :
print ( name_age [ j ], end = ' ' ) # 연소자의 이름과 나이
# 3-2 전공별 평균 성적
major_list = []
for i in range ( 0 , len ( students )):
if students [ i ][ 2 ] not in major_list :
major_list . append ( students [ i ][ 2 ])
#print(major_list) # 전공 리스트
cnt_major_s1 = 0
list_major_point1 = []
cnt_major_s2 = 0
list_major_point2 = []
cnt_major_s3 = 0
list_major_point3 = []
for i in range ( 0 , len ( students )):
for major in major_list :
if major == '컴퓨터공학' :
cnt_major_s1 += 1
list_major_point1 . append ( students [ i ][ 3 ])
elif major == '경영학' :
cnt_major_s2 += 1
list_major_point2 . append ( students [ i ][ 3 ])
else :
cnt_major_s3 += 1
list_major_point3 . append ( students [ i ][ 3 ])
print ( "컴퓨터공학 평균 점수 | 학생수:" , sum ( list_major_point1 ) / len ( list_major_point1 ), '|' , cnt_major_s1 )
print ( "경영학 평균 점수 | 학생수:" , sum ( list_major_point2 ) / len ( list_major_point2 ), '|' , cnt_major_s2 )
print ( "전자공학 평균 점수 | 학생수:" , sum ( list_major_point2 ) / len ( list_major_point3 ), '|' , cnt_major_s3 )
# 3-3 성적이 4.0 이상인 사람들의 이름과 전공
for i in range ( 0 , len ( students )):
if students [ i ][ 3 ] >= 4.0 :
print ( students [ i ][ 0 ], students [ i ][ 2 ], end = " " )
print ()
# 3-4 모든 사람의 평균 나이
total_age = []
for i in range ( 0 , len ( students )):
total_age . append ( int ( students [ i ][ 1 ]))
print ( "학생들의 평균 나이 :" , sum ( total_age ) / len ( students ))
# 3-5 성적순으로 정렬된 이름 목록
students_name = []
students_grade = []
for i in range ( 0 , len ( students )):
students_name . append ( students [ i ][ 0 ])
students_grade . append ( students [ i ][ 3 ])
for j in range ( 0 , len ( students )):
name_grade = list ( zip ( students_name , students_grade ))
print ( sorted ( name_grade , key = lambda x : ( - x [ 1 ], x [ 0 ]))) # 성적순 내림 정렬 후 같은 성적에 이름 순 오름정렬
# 문제 4: 세트 연산 (Set)
# 설명 : 집합 연산과 중복 제거 기능을 테스트하는 문제입니다.
"""요구사항:
- 여러 스터디 그룹에 참여하는 학생들의 명단이 주어집니다.
- 다음 정보를 계산하고 출력하세요:
1. 모든 스터디 그룹에 속한 전체 학생 목록
2. 파이썬 스터디와 자바 스터디 모두에 참여하는 학생 목록
3. 파이썬 스터디에만 참여하는 학생 목록
4. 각 스터디에 참여하는 학생 수
5. 모든 스터디에 참여하는 학생이 있는지 확인
"""
주어진 데이터:
python_study = { "김철수" , "이영희" , "박민수" , "정지원" , "최유진" , "장미영" }
java_study = { "김철수" , "박민수" , "최유진" , "윤태민" , "한서연" }
web_study = { "이영희" , "정지원" , "윤태민" , "한서연" , "장미영" }
algorithm_study = { "김철수" , "이영희" , "정지원" , "한서연" }
# 문제 4-1 모든 스터디 그룹에 속한 전체 학생 목록
total_A = python_study | java_study
total_B = total_A | web_study
Total_study1 = total_B | algorithm_study
print ( Total_study1 ) # 총 8명
# 문제 4-2 파이썬 스터디와 자바 스터디 모두에 참여하는 학생 목록
python_java = python_study & java_study
print ( python_java ) # 3명
# 문제 4-3 파이썬 스터디에만 참여하는 학생
study_result1 = python_study - java_study
study_result2 = study_result1 - web_study
final_study_result = study_result2 - algorithm_study
print ( final_study_result ) # 모든 학생이 2개 이상의 스터디에 참여
# 문제 4-4 각 스터디에 참여하는 학생 수
print ( f "python_study에 참여하는 학생 수 :" , len ( python_study ))
print ( f "java_study에 참여하는 학생 수 :" , len ( java_study ))
print ( f "web_study에 참여하는 학생 수 :" , len ( web_study ))
print ( f "algorithm_study에 참여하는 학생 수 :" , len ( algorithm_study ))
# 문제 4-5 모든 스터디에 참여하는 학생이 있는지 확인
total_C = python_study & java_study
total_D = total_C & web_study
Total_study2 = total_D & algorithm_study
print ( len ( Total_study2 )) # 각 집단의 교집합을 구해본 결과 그 수가 나오지 않았다! 즉 없다.
## 문제 5: 딕셔너리 활용 (Dictionary)
# 설명 : 키-값 쌍 데이터 구조와 딕셔너리 컴프리헨션을 테스트하는 문제입니다.
"""
요구사항:
- 온라인 상점의 상품 정보와 장바구니 정보가 주어집니다.
- 다음 작업을 수행하는 코드를 작성하세요:
1. 장바구니에 담긴 상품의 총 가격 계산
2. 가장 비싼 상품과 가장 저렴한 상품의 이름과 가격
3. 장바구니에 담긴 상품 중 재고가 부족한 상품 목록
4. 카테고리별 상품 수와 평균 가격
5. 가격이 10,000원 이상인 상품에 10% 할인을 적용한 새로운 딕셔너리 생성
"""
# 코드 구현
주어진 데이터:
# 상품 정보 (상품명: [가격, 재고, 카테고리])
products = {
"노트북" : [ 1200000 , 5 , "전자제품" ],
"스마트폰" : [ 800000 , 10 , "전자제품" ],
"티셔츠" : [ 20000 , 20 , "의류" ],
"청바지" : [ 50000 , 3 , "의류" ],
"신발" : [ 80000 , 8 , "패션" ],
"모자" : [ 15000 , 15 , "패션" ],
"가방" : [ 120000 , 2 , "패션" ],
"책" : [ 30000 , 25 , "문구" ],
"펜" : [ 3000 , 100 , "문구" ]
}
# 장바구니 (상품명: 수량)
cart = {
"노트북" : 1 ,
"청바지" : 2 ,
"신발" : 1 ,
"모자" : 3 ,
"책" : 5 ,
"펜" : 10
}
# 문제 5-1 장바구니에 담긴 상품의 총 가격 계산
total_price = 0
for i , j in cart . items ():
price = products [ i ][ 0 ]
total_price += price * j
print ( total_price )
# 문제 5-2 가장 비싼 상품과 가장 저렴한 상품의 이름과 가격
max_price = 0
min_price = 100000000000000000000
for i , j in products . items ():
if max_price < j [ 0 ]:
max_price = j [ 0 ]
if j [ 0 ] < min_price :
min_price = j [ 0 ]
# print(max_price) 최고가
# print(min_price) 최저가
for i , j in products . items ():
if j [ 0 ] == max_price :
print ( i , j [ 0 ])
if j [ 0 ] == min_price :
print ( i , j [ 0 ])
# 문제 5-3 장바구니에 담긴 상품 중 재고가 부족한 상품 목록
cart_stock_list = []
for i , j in cart . items ():
stock = products [ i ][ 1 ]
if j > stock :
cart_stock_list . append [ i ]
print ( cart_stock_list )
# 문제 5-4 카테고리별 상품 수와 평균 가격
category_dict = {}
for i in products . values ():
category = i [ 2 ]
price = i [ 0 ]
if category in category_dict :
category_dict [ category ][ 'cnt' ] += 1
category_dict [ category ][ 'sum_price' ] += price
else :
category_dict [ category ] = { 'cnt' : 1 , 'sum_price' : price }
#print(category_dict)
avg_price_dict = {}
for C , S in category_dict . items ():
count = S [ 'cnt' ]
total_price = S [ 'sum_price' ]
avg_price_dict [ C ] = { total_price / count }
print ( avg_price_dict )
# 문제 5-5 가격이 10,000원 이상인 상품에 10% 할인을 적용한 새로운 딕셔너리 생성
discount_price_dict = {}
for a , b in products . items ():
B = b [ 0 ]
if B >= 10000 :
BB = B * 0.9
else :
BB = B
discount_price_dict [ a ] = [ BB ]
print ( discount_price_dict )