Python Programming
  • Home
  • Intro
    • History & Background
    • Python Setup
  • QPB
    • Part I: Chapter 1-3
    • Part II
    • 5. Lists, Tuples, Sets
  • Exercises
    • Chapter 5: Lists, Tuples, Sets
    • Chapter 6: Strings
  • References
    • QPB Part 1
    • QPB Part 2
    • QPB Part 3
    • QPB Part 4

On this page

  • 문제 1: 리스트 슬라이싱 마스터하기
  • 문제 2: 리스트 조작 종합
  • 문제 3: 커스텀 정렬
  • 문제 4: 튜플 언패킹 활용
  • 문제 5: 리스트 연산과 중복 제거
  • 문제 6: 2차원 리스트 다루기
  • 문제 7: Set 연산 활용
  • 문제 8: 리스트에서 통계 구하기
  • 문제 9: 튜플과 리스트 변환
  • 문제 10: 리스트 복사와 수정
  • 문제 11**: 단어 빈도 분석
  • 문제 12**: 데이터 그룹화와 집계

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]에서 다음을 수행하는 코드를 작성하세요:

  1. 홀수 인덱스 위치의 모든 요소를 추출 (20, 40, 60, 80)
  2. 리스트를 역순으로 만들기 (슬라이싱 사용)
  3. 리스트의 중간 3개 요소 추출 (40, 50, 60)

힌트: 슬라이싱의 step 파라미터를 활용하세요.

# 여기에 코드를 작성하세요
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]

문제 2: 리스트 조작 종합

빈 리스트 scores를 만들고, 다음 작업을 순서대로 수행하세요:

  1. 점수 [85, 90, 78, 92, 88]을 하나씩 append로 추가
  2. 인덱스 2 위치에 95를 삽입
  3. 가장 낮은 점수를 찾아 제거 (remove 사용)
  4. 리스트를 내림차순으로 정렬
  5. 최종 리스트와 평균 점수를 출력

출력 예시:

최종 점수: [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)]

다음을 계산하세요:

  1. 모든 x 좌표의 합
  2. 모든 y 좌표의 합
  3. 원점(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]

다음을 수행하세요:

  1. 두 리스트를 합치기 (extend 사용)
  2. 중복을 제거한 고유값의 개수 출력
  3. 양쪽 리스트에 모두 존재하는 요소 찾기
  4. 합친 리스트에서 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]
]

다음을 수행하세요:

  1. 두 번째 행(row)의 모든 요소 출력
  2. 첫 번째 열(column)의 모든 요소를 리스트로 추출
  3. 대각선 요소(1, 5, 9)를 리스트로 추출
  4. 모든 요소의 합 계산
# 여기에 코드를 작성하세요
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'}

다음을 찾으세요:

  1. 세 명 모두가 구매한 책
  2. 적어도 한 명이 구매한 모든 책
  3. A만 구매하고 B와 C는 구매하지 않은 책
  4. 정확히 두 명이 구매한 책
# 여기에 코드를 작성하세요
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]

다음을 계산하세요:

  1. 최고 온도와 최저 온도
  2. 평균 온도
  3. 평균보다 높은 온도의 개수
  4. 온도 범위 (최고 - 최저)

보너스: 표준편차도 계산해보세요 (표준편차 공식: \(\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)
]

각 튜플은 (이름, 수학점수, 영어점수, 과학점수)를 나타냅니다.

다음을 수행하세요:

  1. 각 학생의 평균 점수를 계산하여 (이름, 평균) 형태의 새로운 리스트 생성
  2. 평균 점수 기준으로 학생들을 내림차순 정렬
  3. 수학 점수가 가장 높은 학생의 이름 출력
# 여기에 코드를 작성하세요
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"

요구사항:

  1. 단어별 빈도를 [(단어, 빈도), ...] 형태의 리스트로 반환
  2. 빈도가 높은 순으로 정렬
  3. 대소문자 구분 없이 처리
  4. 상위 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),
]

각 튜플은 (카테고리, 제품명, 가격)을 나타냅니다.

요구사항:

판매 데이터 분석

  1. 카테고리별로 총 매출, 평균 가격, 상품 개수를 계산
  2. 각 카테고리에서 가장 비싼 상품과 가격 찾기
  3. 결과를 리스트와 튜플만 사용하여 표현 (딕셔너리 사용 금지)
  4. 결과 형식: [(카테고리, 총매출, 평균가격, 상품개수, (최고가상품, 가격)), ...]
  5. 총 매출 기준 내림차순 정렬

추가로 “카테고리별 매출 비중” 계산

# 예상 출력:
=== 판매 데이터 분석 ===

Electronics:
  총매출: $1,600
  평균가격: $400.00
  상품개수: 4개
  최고가: Laptop ($1,200)

Clothing:
  총매출: $110
  평균가격: $36.67
  상품개수: 3개
  최고가: Pants ($50)

=== 카테고리별 매출 비중 ===
Electronics: 93.6%
Clothing: 6.4%
Chapter 6: Strings

This work © 2025 by Sungkyun Cho is licensed under CC BY-NC-SA 4.0