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: Dictionary 생성과 기본 조작
  • 문제 2: keys(), values(), items() 활용
  • 문제 3: get()과 setdefault() 메서드
  • 문제 4: Dictionary 병합과 update()
  • 문제 5: 튜플을 키로 사용하기
  • 문제 6: Dictionary Comprehension
  • 문제 7: defaultdict 활용
  • 문제 8: 중첩 Dictionary 다루기
  • 문제 9: Dictionary를 사용한 데이터 변환
  • 문제 10: Dictionary와 집합 연산
  • 문제 11**: 고급 텍스트 분석기

Exercises: Chapter 7

Chapter 7: Dictionaries - 연습문제

문제 1: Dictionary 생성과 기본 조작

학생들의 정보를 저장하는 딕셔너리를 만드세요.

요구사항:

  1. 빈 딕셔너리 students를 생성
  2. 다음 학생 정보를 추가:
    • 이름: “Alice”, 학번: “2023001”, 전공: “Computer Science”
    • 이름: “Bob”, 학번: “2023002”, 전공: “Mathematics”
    • 이름: “Charlie”, 학번: “2023003”, 전공: “Physics”
  3. 딕셔너리에 저장된 학생 수 출력
  4. Bob의 전공을 “Data Science”로 변경
  5. 모든 학생 정보 출력

힌트: 학번을 키로 사용하고, 학생 정보는 중첩 딕셔너리로 저장하세요.

# 여기에 코드를 작성하세요

문제 2: keys(), values(), items() 활용

다음 제품 재고 딕셔너리를 사용하여:

inventory = {
    "apple": 50,
    "banana": 30,
    "orange": 45,
    "grape": 25,
    "melon": 10
}

다음을 수행하세요:

  1. 모든 제품명을 리스트로 출력
  2. 총 재고 수량 계산 및 출력
  3. 평균 재고 수량 계산 및 출력
  4. 재고가 30개 미만인 제품과 수량을 출력
  5. 모든 제품과 재고를 “제품: 수량” 형태로 출력

힌트: keys(), values(), items() 메서드를 활용하세요.

# 여기에 코드를 작성하세요
inventory = {
    "apple": 50,
    "banana": 30,
    "orange": 45,
    "grape": 25,
    "melon": 10
}

문제 3: get()과 setdefault() 메서드

사용자의 선호도를 저장하는 시스템을 구현하세요.

preferences = {
    "theme": "dark",
    "language": "Korean",
    "notifications": True
}

요구사항:

  1. “theme” 설정값을 가져와 출력 (get 사용)
  2. “font_size” 설정값을 가져오되, 없으면 “medium”을 기본값으로 출력
  3. “auto_save” 설정값을 확인하고, 없으면 True로 설정 (setdefault 사용)
  4. “sound” 설정값을 확인하고, 없으면 False로 설정 (setdefault 사용)
  5. 최종 preferences 딕셔너리 전체를 출력

힌트: get()은 딕셔너리를 수정하지 않지만, setdefault()는 키가 없을 때 추가합니다.

# 여기에 코드를 작성하세요
preferences = {
    "theme": "dark",
    "language": "Korean",
    "notifications": True
}

문제 4: Dictionary 병합과 update()

두 개의 온라인 쇼핑몰 장바구니를 합치는 시스템을 만드세요.

cart1 = {"laptop": 1, "mouse": 2, "keyboard": 1}
cart2 = {"mouse": 1, "monitor": 1, "keyboard": 1}

요구사항:

  1. cart1과 cart2를 합쳐서 새로운 딕셔너리 merged_cart를 생성
  2. 동일한 제품이 있으면 수량을 합산 (예: mouse는 3개)
  3. 합쳐진 장바구니의 총 제품 종류 수 출력
  4. 합쳐진 장바구니의 총 제품 개수 출력
  5. 최종 장바구니 내용을 “제품: 수량” 형식으로 출력

힌트: update() 메서드는 단순히 덮어쓰므로, 수량 합산을 위해서는 추가 로직이 필요합니다.

# 여기에 코드를 작성하세요
cart1 = {"laptop": 1, "mouse": 2, "keyboard": 1}
cart2 = {"mouse": 1, "monitor": 1, "keyboard": 1}

문제 5: 튜플을 키로 사용하기

좌표 평면 위의 점들과 그 점의 특성을 저장하는 딕셔너리를 만드세요.

요구사항:

  1. 다음 점들을 딕셔너리에 저장 (튜플을 키로 사용):
    • 점 (0, 0): “origin”
    • 점 (1, 0): “point A”
    • 점 (0, 1): “point B”
    • 점 (1, 1): “point C”
    • 점 (-1, -1): “point D”
  2. 점 (1, 1)의 특성 출력
  3. 점 (2, 2)가 딕셔너리에 있는지 확인
  4. x 좌표가 양수인 모든 점을 찾아 출력
  5. 새로운 점 (2, 2)를 “point E”로 추가
  6. 전체 점들의 개수 출력

힌트: 튜플 (x, y)를 딕셔너리 키로 사용할 수 있습니다.

# 여기에 코드를 작성하세요

문제 6: Dictionary Comprehension

리스트와 변환 규칙을 사용하여 딕셔너리를 생성하세요.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']

요구사항:

  1. numbers에서 각 숫자를 키로, 그 제곱을 값으로 하는 딕셔너리 생성
  2. numbers에서 짝수만 필터링하여 키로, 그 숫자를 2로 나눈 값을 값으로 하는 딕셔너리 생성
  3. words에서 각 단어를 키로, 단어의 길이를 값으로 하는 딕셔너리 생성
  4. words에서 길이가 6 이상인 단어만 키로, 대문자로 변환한 값을 값으로 하는 딕셔너리 생성
  5. 1부터 10까지의 숫자를 키로, “even” 또는 “odd”를 값으로 하는 딕셔너리 생성

힌트: Dictionary comprehension 형식: {key_expr: value_expr for item in iterable}

# 여기에 코드를 작성하세요
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']

문제 7: defaultdict 활용

collections.defaultdict를 사용하여 학생들의 과목별 점수를 관리하세요.

from collections import defaultdict

# 학생별 과목 점수 리스트 (학생이름, 과목, 점수)
scores = [
    ("Alice", "Math", 85),
    ("Alice", "Science", 90),
    ("Bob", "Math", 78),
    ("Bob", "Science", 88),
    ("Alice", "English", 92),
    ("Charlie", "Math", 95),
    ("Bob", "English", 80),
    ("Charlie", "Science", 89)
]

요구사항:

  1. defaultdict(list)를 사용하여 학생별로 (과목, 점수) 튜플을 저장
  2. defaultdict(int)를 사용하여 각 과목의 응시 학생 수 카운트
  3. 각 학생의 평균 점수 계산 및 출력
  4. 각 과목의 평균 점수 계산 및 출력
  5. 평균 점수가 가장 높은 학생 찾기

힌트: defaultdict(list)는 새로운 키에 대해 빈 리스트를, defaultdict(int)는 0을 기본값으로 제공합니다.

# 여기에 코드를 작성하세요
from collections import defaultdict

scores = [
    ("Alice", "Math", 85),
    ("Alice", "Science", 90),
    ("Bob", "Math", 78),
    ("Bob", "Science", 88),
    ("Alice", "English", 92),
    ("Charlie", "Math", 95),
    ("Bob", "English", 80),
    ("Charlie", "Science", 89)
]

문제 8: 중첩 Dictionary 다루기

회사의 부서별 직원 정보를 저장하는 중첩 딕셔너리를 만들고 조작하세요.

요구사항:

  1. 다음 구조의 딕셔너리를 생성:

    company = {
        "Engineering": {
            "Alice": {"position": "Senior", "salary": 90000},
            "Bob": {"position": "Junior", "salary": 60000}
        },
        "Marketing": {
            "Charlie": {"position": "Manager", "salary": 85000},
            "Diana": {"position": "Senior", "salary": 70000}
        }
    }
  2. Engineering 부서의 모든 직원 이름 출력

  3. 전체 직원 수 계산

  4. Charlie의 직책(position) 출력

  5. 각 부서의 평균 연봉 계산 및 출력

  6. 회사 전체의 총 급여 지출 계산

  7. 연봉이 가장 높은 직원의 이름과 부서 찾기

힌트: 중첩 딕셔너리는 dict[key1][key2] 형식으로 접근합니다.

# 여기에 코드를 작성하세요
company = {
    "Engineering": {
        "Alice": {"position": "Senior", "salary": 90000},
        "Bob": {"position": "Junior", "salary": 60000}
    },
    "Marketing": {
        "Charlie": {"position": "Manager", "salary": 85000},
        "Diana": {"position": "Senior", "salary": 70000}
    }
}

문제 9: Dictionary를 사용한 데이터 변환

학생들의 점수 리스트를 다양한 형태로 변환하세요.

# (학생명, 과목, 점수) 형태의 리스트
raw_data = [
    ("Alice", "Math", 85),
    ("Bob", "Math", 92),
    ("Alice", "Science", 88),
    ("Charlie", "Math", 78),
    ("Bob", "Science", 95),
    ("Charlie", "Science", 82),
    ("Alice", "English", 90),
    ("Bob", "English", 87)
]

요구사항:

  1. 학생 중심 뷰: {학생명: {과목: 점수}} 형태로 변환
  2. 과목 중심 뷰: {과목: {학생명: 점수}} 형태로 변환
  3. 학생별 총점을 계산하여 {학생명: 총점} 딕셔너리 생성
  4. 과목별 평균을 계산하여 {과목: 평균} 딕셔너리 생성
  5. 가장 어려운 과목(평균이 가장 낮은 과목) 찾기

힌트: 중첩 딕셔너리를 만들 때 setdefault()를 활용하면 편리합니다.

# 여기에 코드를 작성하세요
raw_data = [
    ("Alice", "Math", 85),
    ("Bob", "Math", 92),
    ("Alice", "Science", 88),
    ("Charlie", "Math", 78),
    ("Bob", "Science", 95),
    ("Charlie", "Science", 82),
    ("Alice", "English", 90),
    ("Bob", "English", 87)
]

문제 10: Dictionary와 집합 연산

두 사용자의 관심사를 비교하고 분석하세요.

user1_interests = {
    "Python": 5,
    "JavaScript": 3,
    "Data Science": 4,
    "Machine Learning": 5,
    "Web Development": 2
}

user2_interests = {
    "Python": 4,
    "Java": 3,
    "Data Science": 5,
    "Cloud Computing": 4,
    "Web Development": 3
}

(숫자는 관심도를 나타냄: 1-5 scale)

요구사항:

  1. 두 사용자가 공통으로 관심 있는 주제 찾기 (교집합)
  2. 각 사용자만의 고유한 관심사 찾기 (차집합)
  3. 두 사용자 중 한 명이라도 관심 있는 모든 주제 찾기 (합집합)
  4. 공통 관심사 중 두 사용자의 관심도 차이가 1 이하인 주제 찾기
  5. 각 사용자의 관심사를 관심도 순으로 정렬하여 출력

힌트: keys() 메서드가 반환하는 view는 집합 연산(&, |, -)을 지원합니다.

# 여기에 코드를 작성하세요
user1_interests = {
    "Python": 5,
    "JavaScript": 3,
    "Data Science": 4,
    "Machine Learning": 5,
    "Web Development": 2
}

user2_interests = {
    "Python": 4,
    "Java": 3,
    "Data Science": 5,
    "Cloud Computing": 4,
    "Web Development": 3
}

문제 11**: 고급 텍스트 분석기

주어진 텍스트를 분석하여 다양한 통계를 제공하는 시스템을 구현하세요.

text = """
Python is a high-level programming language. Python is widely used in data science.
Many companies use Python for web development. Python's syntax is clean and readable.
Learning Python is a great choice for beginners. Python has a large community.
Python supports multiple programming paradigms. Python is an interpreted language.
"""

요구사항:

  1. 각 단어의 출현 빈도를 계산 (대소문자 구분 없이, 구두점 제거)

  2. 가장 많이 등장하는 상위 5개 단어와 빈도 출력

  3. 한 번만 등장하는 단어들의 목록 출력

  4. 단어 길이별 분포 계산 (예: 3글자 단어 5개, 4글자 단어 8개 등)

  5. 각 단어가 처음 등장하는 위치(단어 순서)를 딕셔너리로 저장

  6. “Python”이 등장한 모든 위치(단어 순서) 찾기

  7. 결과를 다음 형식으로 출력:

    === 텍스트 분석 결과 ===
    총 단어 수: X
    고유 단어 수: Y
    
    상위 5개 빈출 단어:
    1. python: 8회
    ...
    
    단어 길이 분포:
    2글자: 5개
    3글자: 8개
    ...

힌트: 여러 개의 딕셔너리를 조합하여 사용하세요.

def analyze_text(text):
    """
    텍스트를 분석하여 다양한 통계를 계산합니다.
    
    Args:
        text: 분석할 텍스트
    
    Returns:
        dict: 분석 결과를 담은 딕셔너리
    """
    import string
    
    # 1. 텍스트 전처리: 소문자 변환 및 구두점 제거
    text_lower = text.lower()
    translator = str.maketrans('', '', string.punctuation)
    text_clean = text_lower.translate(translator)
    
    # 2. 단어 추출
    words = text_clean.split()
    
    # 3. 단어 빈도 계산 (힌트: defaultdict 또는 일반 dict 사용)
    word_freq = {}  # <-- 여기를 구현하세요
    for word in words:
        # word_freq[word] = ...
        pass
    
    # 4. 단어 길이별 분포 (힌트: 단어 길이를 키로 사용)
    length_dist = {}  # <-- 여기를 구현하세요
    
    # 5. 각 단어의 첫 등장 위치
    first_position = {}  # <-- 여기를 구현하세요
    # 힌트: enumerate()를 사용하여 위치와 단어를 함께 얻기
    
    # 6. 특정 단어("python")의 모든 등장 위치
    python_positions = []  # <-- 여기를 구현하세요
    
    # 7. 상위 5개 빈출 단어 (힌트: sorted()와 key 파라미터 사용)
    top5 = []  # <-- 여기를 구현하세요
    # sorted(word_freq.items(), key=lambda x: x[1], reverse=True)[:5]
    
    # 8. 한 번만 등장하는 단어들
    unique_words = []  # <-- 여기를 구현하세요
    
    # 결과 출력
    print("=== 텍스트 분석 결과 ===")
    print(f"총 단어 수: {len(words)}")
    print(f"고유 단어 수: {len(word_freq)}")
    print()
    
    print("상위 5개 빈출 단어:")
    for i, (word, count) in enumerate(top5, 1):
        print(f"{i}. {word}: {count}회")
    print()
    
    print("한 번만 등장하는 단어:")
    print(f"{len(unique_words)}개: {', '.join(sorted(unique_words)[:10])}...")
    print()
    
    print("단어 길이 분포:")
    for length in sorted(length_dist.keys()):
        print(f"{length}글자: {length_dist[length]}개")
    print()
    
    print(f"'python' 등장 위치: {python_positions}")
    
    return {
        'total_words': len(words),
        'unique_words': len(word_freq),
        'word_freq': word_freq,
        'top5': top5,
        'length_dist': length_dist
    }

# 테스트
text = """
Python is a high-level programming language. Python is widely used in data science.
Many companies use Python for web development. Python's syntax is clean and readable.
Learning Python is a great choice for beginners. Python has a large community.
Python supports multiple programming paradigms. Python is an interpreted language.
"""

result = analyze_text(text)
Chapter 6: Strings
Chapter 8: Control flow

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