# 여기에 코드를 작성하세요
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]
Exercises: Chapter 5
Chapter 5: Lists, Tuples, and Sets - 연습문제
Chapter 4 (The absolute basics)를 포함
문제 1: 리스트 슬라이싱 마스터하기
주어진 리스트 numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]에서 다음을 수행하는 코드를 작성하세요:
- 홀수 인덱스 위치의 모든 요소를 추출 (20, 40, 60, 80)
- 리스트를 역순으로 만들기 (슬라이싱 사용)
- 리스트의 중간 3개 요소 추출 (40, 50, 60)
힌트: 슬라이싱의 step 파라미터를 활용하세요.
문제 2: 리스트 조작 종합
빈 리스트 scores를 만들고, 다음 작업을 순서대로 수행하세요:
- 점수 [85, 90, 78, 92, 88]을 하나씩
append로 추가 - 인덱스 2 위치에 95를 삽입
- 가장 낮은 점수를 찾아 제거 (remove 사용)
- 리스트를 내림차순으로 정렬
- 최종 리스트와 평균 점수를 출력
출력 예시:
최종 점수: [95, 92, 90, 88, 85]
평균: 90.0
# 여기에 코드를 작성하세요
문제 3: 커스텀 정렬
다음 학생 이름 리스트를 이름의 길이 기준으로 정렬하되, 길이가 같으면 알파벳 순으로 정렬하세요.
students = ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace']힌트: sort() 메서드의 key 파라미터를 사용하세요. 튜플을 반환하는 lambda 함수를 활용할 수 있습니다.
# 여기에 코드를 작성하세요
students = ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace']
문제 4: 튜플 언패킹 활용
다음 좌표 리스트에서 각 점의 x, y 좌표를 언패킹하여 처리하세요:
coordinates = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]다음을 계산하세요:
- 모든 x 좌표의 합
- 모든 y 좌표의 합
- 원점(0, 0)으로부터 가장 먼 점 찾기 (거리 = \(\sqrt{x^2 + y^2}\))
힌트: 리스트 컴프리헨션과 튜플 언패킹을 활용하세요.
# 여기에 코드를 작성하세요
coordinates = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
문제 5: 리스트 연산과 중복 제거
두 개의 리스트가 주어졌을 때:
list_a = [1, 2, 3, 4, 5, 3, 2, 1]
list_b = [4, 5, 6, 7, 8, 6, 5]다음을 수행하세요:
- 두 리스트를 합치기 (extend 사용)
- 중복을 제거한 고유값의 개수 출력
- 양쪽 리스트에 모두 존재하는 요소 찾기
- 합친 리스트에서 3번 이상 등장하는 요소 찾기
# 여기에 코드를 작성하세요
list_a = [1, 2, 3, 4, 5, 3, 2, 1]
list_b = [4, 5, 6, 7, 8, 6, 5]
문제 6: 2차원 리스트 다루기
다음 2차원 리스트(행렬)가 주어졌을 때:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]다음을 수행하세요:
- 두 번째 행(row)의 모든 요소 출력
- 첫 번째 열(column)의 모든 요소를 리스트로 추출
- 대각선 요소(1, 5, 9)를 리스트로 추출
- 모든 요소의 합 계산
# 여기에 코드를 작성하세요
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
문제 7: Set 연산 활용
온라인 서점에서 세 명의 고객이 구매한 책 목록이 다음과 같습니다:
customer_a = {'Python', 'Java', 'C++', 'JavaScript', 'Ruby'}
customer_b = {'Java', 'C#', 'Go', 'Python', 'Swift'}
customer_c = {'JavaScript', 'TypeScript', 'Python', 'Rust'}다음을 찾으세요:
- 세 명 모두가 구매한 책
- 적어도 한 명이 구매한 모든 책
- A만 구매하고 B와 C는 구매하지 않은 책
- 정확히 두 명이 구매한 책
# 여기에 코드를 작성하세요
customer_a = {'Python', 'Java', 'C++', 'JavaScript', 'Ruby'}
customer_b = {'Java', 'C#', 'Go', 'Python', 'Swift'}
customer_c = {'JavaScript', 'TypeScript', 'Python', 'Rust'}
문제 8: 리스트에서 통계 구하기
다음 온도 데이터(섭씨)에서 통계를 계산하세요:
temperatures = [23.5, 25.1, 22.8, 24.6, 26.3, 23.9, 25.5, 24.2, 23.7, 25.8]다음을 계산하세요:
- 최고 온도와 최저 온도
- 평균 온도
- 평균보다 높은 온도의 개수
- 온도 범위 (최고 - 최저)
보너스: 표준편차도 계산해보세요 (표준편차 공식: \(\sqrt{\dfrac{\sum (x-\overline{x})^2}{n}}\))
# 여기에 코드를 작성하세요
temperatures = [23.5, 25.1, 22.8, 24.6, 26.3, 23.9, 25.5, 24.2, 23.7, 25.8]
문제 9: 튜플과 리스트 변환
학생 정보가 다음과 같이 튜플의 리스트로 주어졌습니다:
students = [
('Alice', 85, 90, 78),
('Bob', 92, 88, 84),
('Charlie', 78, 85, 80),
('David', 95, 92, 88)
]각 튜플은 (이름, 수학점수, 영어점수, 과학점수)를 나타냅니다.
다음을 수행하세요:
- 각 학생의 평균 점수를 계산하여 (이름, 평균) 형태의 새로운 리스트 생성
- 평균 점수 기준으로 학생들을 내림차순 정렬
- 수학 점수가 가장 높은 학생의 이름 출력
# 여기에 코드를 작성하세요
students = [
('Alice', 85, 90, 78),
('Bob', 92, 88, 84),
('Charlie', 78, 85, 80),
('David', 95, 92, 88)
]
문제 10: 리스트 복사와 수정
다음 코드의 출력을 예측하고, 각 경우에 왜 그런 결과가 나오는지 shallow copy와 deep copy의 차이로 설명하세요.
# 경우 1
list1 = [1, 2, 3]
list2 = list1
list2.append(4)
print("경우 1:", list1)
# 경우 2
list3 = [1, 2, 3]
list4 = list3[:]
list4.append(4)
print("경우 2:", list3)
# 경우 3
list5 = [[1, 2], [3, 4]]
list6 = list5[:]
list6[0].append(99)
print("경우 3:", list5)문제 11**: 단어 빈도 분석
텍스트에서 각 단어의 빈도를 분석하되, 리스트와 튜플만 사용하여 구현하세요 (딕셔너리 사용 없이).
text = "the quick brown fox jumps over the lazy dog the fox was quick"요구사항:
- 단어별 빈도를
[(단어, 빈도), ...]형태의 리스트로 반환 - 빈도가 높은 순으로 정렬
- 대소문자 구분 없이 처리
- 상위 N개 단어만 반환하는 옵션 추가
def word_frequency(text, top_n=None):
"""
단어 빈도 분석 (딕셔너리 사용 없이)
Args:
text: 분석할 텍스트
top_n: 상위 N개만 반환 (None이면 전체)
Returns:
[(단어, 빈도), ...] 형태의 리스트 (빈도 내림차순)
"""
# 1. 텍스트(text)를 소문자로 변환하고 단어로 분리
words = ...
# 2. 고유 단어 추출
unique_words = []
...
# 3. 각 단어의 빈도 계산
word_counts = []
for word in unique_words:
pass
# 4. 빈도 기준 내림차순 정렬 (빈도 같으면 알파벳 순)
# 5. top_n이 None이 아니면 top_n개만 반환
if top_n is not None:
return word_counts[:top_n]
# top_n이 None이면 전체 단어 반환
return word_counts
# 테스트
text = "the quick brown fox jumps over the lazy dog the fox was quick"
word_frequency(text)
# [('the', 3), ('fox', 2), ('quick', 2), ('brown', 1), ...]
word_frequency(text, top_n=3)
# [('the', 3), ('fox', 2), ('quick', 2)]문제 12**: 데이터 그룹화와 집계
다음 문제에 대해서 Copilot을 이용해 코드를 작성하고 살펴보세요.
판매 데이터를 제품 카테고리별로 그룹화하고 통계를 계산하세요.
sales_data = [
('Electronics', 'Laptop', 1200),
('Electronics', 'Mouse', 25),
('Clothing', 'Shirt', 30),
('Electronics', 'Keyboard', 75),
('Clothing', 'Pants', 50),
('Clothing', 'Shirt', 30),
('Electronics', 'Monitor', 300),
]각 튜플은 (카테고리, 제품명, 가격)을 나타냅니다.
요구사항:
판매 데이터 분석
- 카테고리별로 총 매출, 평균 가격, 상품 개수를 계산
- 각 카테고리에서 가장 비싼 상품과 가격 찾기
- 결과를 리스트와 튜플만 사용하여 표현 (딕셔너리 사용 금지)
- 결과 형식:
[(카테고리, 총매출, 평균가격, 상품개수, (최고가상품, 가격)), ...] - 총 매출 기준 내림차순 정렬
추가로 “카테고리별 매출 비중” 계산
# 예상 출력:
=== 판매 데이터 분석 ===
Electronics:
총매출: $1,600
평균가격: $400.00
상품개수: 4개
최고가: Laptop ($1,200)
Clothing:
총매출: $110
평균가격: $36.67
상품개수: 3개
최고가: Pants ($50)
=== 카테고리별 매출 비중 ===
Electronics: 93.6%
Clothing: 6.4%