# 여기에 코드를 작성하세요
Exercises: Chapter 7
Chapter 7: Dictionaries - 연습문제
문제 1: Dictionary 생성과 기본 조작
학생들의 정보를 저장하는 딕셔너리를 만드세요.
요구사항:
- 빈 딕셔너리
students를 생성 - 다음 학생 정보를 추가:
- 이름: “Alice”, 학번: “2023001”, 전공: “Computer Science”
- 이름: “Bob”, 학번: “2023002”, 전공: “Mathematics”
- 이름: “Charlie”, 학번: “2023003”, 전공: “Physics”
- 딕셔너리에 저장된 학생 수 출력
- Bob의 전공을 “Data Science”로 변경
- 모든 학생 정보 출력
힌트: 학번을 키로 사용하고, 학생 정보는 중첩 딕셔너리로 저장하세요.
문제 2: keys(), values(), items() 활용
다음 제품 재고 딕셔너리를 사용하여:
inventory = {
"apple": 50,
"banana": 30,
"orange": 45,
"grape": 25,
"melon": 10
}다음을 수행하세요:
- 모든 제품명을 리스트로 출력
- 총 재고 수량 계산 및 출력
- 평균 재고 수량 계산 및 출력
- 재고가 30개 미만인 제품과 수량을 출력
- 모든 제품과 재고를 “제품: 수량” 형태로 출력
힌트: keys(), values(), items() 메서드를 활용하세요.
# 여기에 코드를 작성하세요
inventory = {
"apple": 50,
"banana": 30,
"orange": 45,
"grape": 25,
"melon": 10
}
문제 3: get()과 setdefault() 메서드
사용자의 선호도를 저장하는 시스템을 구현하세요.
preferences = {
"theme": "dark",
"language": "Korean",
"notifications": True
}요구사항:
- “theme” 설정값을 가져와 출력 (get 사용)
- “font_size” 설정값을 가져오되, 없으면 “medium”을 기본값으로 출력
- “auto_save” 설정값을 확인하고, 없으면 True로 설정 (setdefault 사용)
- “sound” 설정값을 확인하고, 없으면 False로 설정 (setdefault 사용)
- 최종 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}요구사항:
- cart1과 cart2를 합쳐서 새로운 딕셔너리
merged_cart를 생성 - 동일한 제품이 있으면 수량을 합산 (예: mouse는 3개)
- 합쳐진 장바구니의 총 제품 종류 수 출력
- 합쳐진 장바구니의 총 제품 개수 출력
- 최종 장바구니 내용을 “제품: 수량” 형식으로 출력
힌트: update() 메서드는 단순히 덮어쓰므로, 수량 합산을 위해서는 추가 로직이 필요합니다.
# 여기에 코드를 작성하세요
cart1 = {"laptop": 1, "mouse": 2, "keyboard": 1}
cart2 = {"mouse": 1, "monitor": 1, "keyboard": 1}
문제 5: 튜플을 키로 사용하기
좌표 평면 위의 점들과 그 점의 특성을 저장하는 딕셔너리를 만드세요.
요구사항:
- 다음 점들을 딕셔너리에 저장 (튜플을 키로 사용):
- 점 (0, 0): “origin”
- 점 (1, 0): “point A”
- 점 (0, 1): “point B”
- 점 (1, 1): “point C”
- 점 (-1, -1): “point D”
- 점 (1, 1)의 특성 출력
- 점 (2, 2)가 딕셔너리에 있는지 확인
- x 좌표가 양수인 모든 점을 찾아 출력
- 새로운 점 (2, 2)를 “point E”로 추가
- 전체 점들의 개수 출력
힌트: 튜플 (x, y)를 딕셔너리 키로 사용할 수 있습니다.
# 여기에 코드를 작성하세요
문제 6: Dictionary Comprehension
리스트와 변환 규칙을 사용하여 딕셔너리를 생성하세요.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']요구사항:
numbers에서 각 숫자를 키로, 그 제곱을 값으로 하는 딕셔너리 생성numbers에서 짝수만 필터링하여 키로, 그 숫자를 2로 나눈 값을 값으로 하는 딕셔너리 생성words에서 각 단어를 키로, 단어의 길이를 값으로 하는 딕셔너리 생성words에서 길이가 6 이상인 단어만 키로, 대문자로 변환한 값을 값으로 하는 딕셔너리 생성- 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)
]요구사항:
defaultdict(list)를 사용하여 학생별로 (과목, 점수) 튜플을 저장defaultdict(int)를 사용하여 각 과목의 응시 학생 수 카운트- 각 학생의 평균 점수 계산 및 출력
- 각 과목의 평균 점수 계산 및 출력
- 평균 점수가 가장 높은 학생 찾기
힌트: 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 다루기
회사의 부서별 직원 정보를 저장하는 중첩 딕셔너리를 만들고 조작하세요.
요구사항:
다음 구조의 딕셔너리를 생성:
company = { "Engineering": { "Alice": {"position": "Senior", "salary": 90000}, "Bob": {"position": "Junior", "salary": 60000} }, "Marketing": { "Charlie": {"position": "Manager", "salary": 85000}, "Diana": {"position": "Senior", "salary": 70000} } }Engineering 부서의 모든 직원 이름 출력
전체 직원 수 계산
Charlie의 직책(position) 출력
각 부서의 평균 연봉 계산 및 출력
회사 전체의 총 급여 지출 계산
연봉이 가장 높은 직원의 이름과 부서 찾기
힌트: 중첩 딕셔너리는 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)
]요구사항:
- 학생 중심 뷰:
{학생명: {과목: 점수}}형태로 변환 - 과목 중심 뷰:
{과목: {학생명: 점수}}형태로 변환 - 학생별 총점을 계산하여
{학생명: 총점}딕셔너리 생성 - 과목별 평균을 계산하여
{과목: 평균}딕셔너리 생성 - 가장 어려운 과목(평균이 가장 낮은 과목) 찾기
힌트: 중첩 딕셔너리를 만들 때 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 이하인 주제 찾기
- 각 사용자의 관심사를 관심도 순으로 정렬하여 출력
힌트: 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.
"""요구사항:
각 단어의 출현 빈도를 계산 (대소문자 구분 없이, 구두점 제거)
가장 많이 등장하는 상위 5개 단어와 빈도 출력
한 번만 등장하는 단어들의 목록 출력
단어 길이별 분포 계산 (예: 3글자 단어 5개, 4글자 단어 8개 등)
각 단어가 처음 등장하는 위치(단어 순서)를 딕셔너리로 저장
“Python”이 등장한 모든 위치(단어 순서) 찾기
결과를 다음 형식으로 출력:
=== 텍스트 분석 결과 === 총 단어 수: 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)