카테고리 없음

데이터 분석 트랙 38일차 25.04.07. [TIL]

jjaio8986 2025. 4. 7. 20:31

[목차]

  • 파이썬 선택형 학습 세션  <문자열과 자료구조> "학습 내용" 및 "과제 정리"  

  • 파이썬 선택형 학습 세션  <문자열과 자료구조> "학습 내용" 및 "과제 정리"   

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(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)