📇
실습 프로젝트 (Practice) · ★★
검색·수정·부분일치
Lv2 · 주소록
이름·전화·이메일을 저장하고 부분 일치 검색을 지원하는 주소록. dict 안의 dict 패턴을 다룹니다.
dict검색
소요 시간
⏱ 2~3시간
난이도
📊 자료구조 활용
선수 조건
🎯 기초 7-8주차
결과물
중첩 dict 와 부분 일치 검색
이 강의에서 배우는 것
- 1이름을 키로 한 중첩 dict 를 다룬다
- 2부분 일치 검색을 case-insensitive 로 한다
- 3정렬된 list 를 출력한다
데이터 모델
python
{"이름": {"phone": "...", "email": "..."}}명령
- add
- find <키워드>
- del <name>
- list
- quit
도전 과제
- 같은 이름 처리 (자동 번호)
- 전화번호 형식 검증
채점 체크리스트
- 부분 일치
- 정렬 출력
- 잘못된 명령 안전
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
solution.py— 전체 동작 코드
CODE
"""주소록 — 부분 일치 검색"""
contacts = {}
def add():
name = input("이름: ").strip()
if not name: return
phone = input("전화: ").strip()
email = input("이메일: ").strip()
contacts[name] = {"phone": phone, "email": email}
print("추가됨")
def find(query):
matched = [(n, c) for n, c in contacts.items() if query.lower() in n.lower()]
if not matched:
print("없음"); return
for name, c in matched:
print(f" {name} | {c['phone']} | {c['email']}")
def show_all():
for name in sorted(contacts):
c = contacts[name]
print(f" {name}: {c['phone']}, {c['email']}")
def main():
while True:
raw = input("\n명령(add/find <q>/del <name>/list/quit): ").strip()
if not raw: continue
parts = raw.split(maxsplit=1)
cmd = parts[0]
arg = parts[1] if len(parts) > 1 else ""
if cmd == "quit": break
elif cmd == "add": add()
elif cmd == "find":
if arg: find(arg)
else: print("키워드 입력")
elif cmd == "del":
if arg in contacts:
del contacts[arg]; print("삭제")
else:
print("없음")
elif cmd == "list":
show_all()
if __name__ == "__main__":
main()▶ 실행 결과
명령(add/find <q>/del <name>/list/quit): add
이름: 홍길동
전화: 010-1234-5678
이메일: hong@x.com
추가됨
명령: find 길동
홍길동 | 010-1234-5678 | hong@x.com📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
프로젝트 구현
목표: 위 사양대로 직접 작성한다.
요구사항
- 중첩 dict
- 부분 일치 (소문자 비교)
- 5개 명령
💡 힌트
query.lower() in n.lower()
입출력 예시
홍길동 | 010-1234-5678 | hong@x.com채점
- · 검색 정확
- · 정렬 출력
▶정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일▶ 실행 결과
(예제 참고)