파이썬 기초: 딕셔너리와 집합
안녕하세요, 저는 재준봇입니다! 코딩이라는 거대한 바다에서 길을 잃지 않도록 아주 쉽고, 힙하게 가이드해 드릴게요.
자, 여러분! 지난 시간까지 우리는 리스트라는 아주 편리한 도구를 배웠습니다. 그런데 리스트만 쓰다 보면 이런 생각이 들 때가 있을 거예요. “아니, 일일이 숫자로 인덱스를 찾아서 데이터를 가져오는 게 너무 비효율적인데? 그냥 이름표를 붙여서 바로바로 찾으면 안 되나?”
바로 여기서 등장하는 구세주가 오늘의 주인공, 딕셔너리(Dictionary)와 집합(Set)입니다. 이 두 녀석만 제대로 다뤄도 여러분의 코딩 퀄리티는 수직 상승합니다. 이거 모르면 나중에 실무 가서 정말 고생하시니까 눈 크게 뜨고 따라오세요!
4강: 파이썬 기초 - 딕셔너리와 집합
1. 딕셔너리(Dictionary): 이름표가 붙은 데이터 보관함
먼저 딕셔너리부터 정복해 봅시다. 딕셔너리를 가장 쉽게 이해하는 방법은 바로 진짜 사전이나 ‘이름표’를 생각하는 거예요.
리스트가 0번, 1번, 2번 이렇게 순서대로 번호표를 나눠준 줄 서기라면, 딕셔너리는 각 데이터에 “이건 이름이야”, “이건 나이야”, “이건 주소야”라고 명확한 이름표를 붙여놓은 상태입니다. 우리가 원하는 데이터를 찾을 때 “몇 번째 칸에 있어?”라고 묻는 게 아니라 “이름표가 ‘나이’인 데이터를 줘!”라고 당당하게 요구하는 방식이죠.
왜 딕셔너리를 써야 할까요?
리스트에서 특정 데이터를 찾으려면 최악의 경우 처음부터 끝까지 다 뒤져야 합니다. 하지만 딕셔너리는 이름표(Key)만 알면 데이터(Value)가 어디 있든 단번에 낚아챌 수 있습니다. 속도가 압도적으로 빠르죠. 진짜 신기하죠?
딕셔너리 활용법: 3가지 핵심 구현 방식
딕셔너리를 다루는 방법은 크게 세 가지 단계로 나뉩니다. 기본 생성, 데이터 수정 및 추가, 그리고 안전하게 꺼내 쓰는 방법입니다.
첫 번째: 딕셔너리 만들기 (기본 생성)
가장 기본이 되는 생성 방법입니다. 중괄호 {}를 사용하고 키: 값 형태로 저장합니다.
# 나의 프로필 정보를 딕셔너리로 만들어 보겠습니다.
my_profile = {
"name": "재준",
"age": 25,
"job": "코딩 튜터",
"hobby": "맛집 탐방"
}
# 출력해서 확인해 봅시다.
print(my_profile)
my_profile = { ... }: 딕셔너리를 생성할 때는 중괄호를 사용합니다."name": "재준": 여기서"name"이 이름표인 ‘키(Key)’이고,"재준"이 실제 내용물인 ‘값(Value)’입니다."age": 25: 키는 문자열뿐만 아니라 숫자와 짝을 이룰 수 있습니다.print(my_profile): 전체 내용을 출력하면 우리가 정의한 이름표와 값들이 함께 나옵니다.
두 번째: 데이터 추가, 수정, 삭제하기
딕셔너리의 가장 큰 장점은 언제든지 내용물을 바꿀 수 있다는 점입니다.
# 기존 프로필에서 정보를 수정하고 추가해 보겠습니다.
my_profile = {"name": "재준", "age": 25, "job": "코딩 튜터"}
# 1. 값 수정하기: 기존에 있는 키에 새로운 값을 넣으면 덮어씌워집니다.
my_profile["age"] = 26
# 2. 값 추가하기: 없는 키에 값을 넣으면 새로운 이름표가 생성됩니다.
my_profile["city"] = "서울"
# 3. 값 삭제하기: del 키워드를 사용하여 이름표 자체를 떼어버립니다.
del my_profile["job"]
print(my_profile)
my_profile["age"] = 26: ‘age’라는 이름표를 찾아 그 내용을 26으로 바꿉니다. (업데이트)my_profile["city"] = "서울": ‘city’라는 이름표가 없었죠? 파이썬은 자동으로 이 이름표를 만들고 값을 저장합니다. (추가)del my_profile["job"]: ‘job’이라는 이름표와 그 값을 완전히 제거합니다. (삭제)
세 번째: 데이터를 안전하고 스마트하게 꺼내기
단순히 []를 써서 값을 가져올 수도 있지만, 만약 없는 키를 불러오면 프로그램이 그대로 멈춰버리는 대참사가 일어납니다. 그래서 우리는 더 똑똑한 방법들을 사용합니다.
# 딕셔너리에서 값을 꺼내는 3가지 방법
user_info = {"id": "coding_king", "level": 99, "point": 5000}
# 방법 1: 기본 인덱싱 (위험함!)
# 존재하지 않는 키를 넣으면 에러가 발생해 프로그램이 종료됩니다.
print(user_info["id"])
# 방법 2: get() 메서드 (안전함!)
# 키가 없어도 에러를 내지 않고 None을 반환합니다. 기본값 설정도 가능해요.
print(user_info.get("email", "이메일 정보가 없습니다."))
# 방법 3: keys(), values(), items() 메서드 (전체 훑기)
# 키만 모아서, 값만 모아서, 혹은 둘 다 모아서 가져올 때 씁니다.
print(user_info.keys()) # 키들만 출력
print(user_info.values()) # 값들만 출력
print(user_info.items()) # (키, 값) 쌍을 튜플로 출력
user_info["id"]: 가장 직관적이지만, 없는 키를 요청하면 프로그램이 뻗어버립니다. 실무에서는 주의해야 해요.user_info.get("email", "..."): ‘email’이 있으면 가져오고, 없으면 뒤에 적어준 기본 메시지를 출력합니다. 프로그램이 멈추지 않게 하는 안전장치입니다.user_info.keys(): 딕셔너리에 어떤 이름표들이 있는지 리스트와 비슷한 형태로 쫙 뽑아줍니다.
초보자 폭풍 질문! 질문: “재준봇님! 딕셔너리의 키(Key)에는 아무거나 다 넣어도 되나요? 리스트를 키로 쓰고 싶어요!”
재준봇의 답변: “안 됩니다! 절대 안 돼요! 딕셔너리의 키는 ‘변하지 않는 값’이어야 합니다. 파이썬에서는 이를 ‘해시 가능(Hashable)’하다고 하는데요. 리스트는 언제든 내용을 바꿀 수 있는 변덕쟁이라 키로 쓸 수 없습니다. 대신 튜플(Tuple)이나 문자열, 숫자는 가능합니다. 기억하세요, 키는 단단하고 변하지 않는 녀석이어야 한다!”
2. 집합(Set): 중복을 허용하지 않는 유니크한 모임
다음은 집합입니다. 집합은 수학 시간에 배웠던 그 집합 맞습니다. 집합의 가장 큰 특징은 두 가지입니다. 첫째, 중복을 허용하지 않는다. 둘째, 순서가 없다.
비유를 들자면, 리스트가 ‘출석부’라면 집합은 ‘파티 초대 명단’입니다. 출석부는 누가 몇 번째로 왔는지 중요하지만, 파티 명단은 그냥 “이 사람이 왔는가?”가 중요하죠. 그리고 똑같은 사람이 두 번 이름이 올라가 있을 필요는 없잖아요?
집합은 언제 사용할까요?
가장 대표적인 활용 사례는 리스트에서 중복된 데이터를 제거하고 싶을 때입니다. 수만 개의 데이터 중에서 유니크한 값만 남겨야 할 때 집합으로 변환했다가 다시 리스트로 바꾸는 마법을 부립니다.
집합 활용법: 3가지 핵심 구현 방식
집합은 생성 방법, 데이터 조작, 그리고 집합 연산이라는 세 가지 포인트가 중요합니다.
첫 번째: 집합 만들기 및 데이터 추가/삭제
집합은 중괄호 {}를 사용하지만 딕셔너리와 달리 키: 값 형태가 아니라 그냥 값만 넣습니다.
# 집합 생성 및 기본 조작
my_favorite_foods = {"치킨", "피자", "떡볶이", "치킨"} # 치킨을 두 번 넣었습니다.
# 1. 중복 제거 확인
print(my_favorite_foods) # 출력해보면 치킨은 하나만 나옵니다.
# 2. 값 추가하기: add() 메서드를 사용합니다.
my_favorite_foods.add("마라탕")
# 3. 값 삭제하기: remove() 메서드를 사용합니다.
my_favorite_foods.remove("피자")
print(my_favorite_foods)
{"치킨", "피자", "떡볶이", "치킨"}: 똑같은 “치킨”을 두 번 넣었지만, 집합은 중복을 자동으로 쳐냅니다.my_favorite_foods.add("마라탕"): 새로운 요리를 추가합니다.my_favorite_foods.remove("피자"): 특정 요리를 명단에서 삭제합니다.
두 번째: 집합의 꽃, 집합 연산 (합집합, 교집합, 차집합)
집합을 쓰는 진짜 이유는 바로 이 연산들 때문입니다. 두 그룹 간의 관계를 파악할 때 이보다 강력한 도구는 없습니다.
# 두 집합의 관계를 분석해 봅시다.
group_a = {"철수", "영희", "민수", "지수"}
group_b = {"민수", "지수", "길동", "철수"}
# 1. 합집합 (Union): 두 그룹의 모든 사람을 합칩니다. (중복 제거됨)
all_people = group_a | group_b
# 또는 group_a.union(group_b) 사용 가능
# 2. 교집합 (Intersection): 두 그룹에 모두 포함된 사람만 찾습니다.
common_people = group_a & group_b
# 또는 group_a.intersection(group_b) 사용 가능
# 3. 차집합 (Difference): A그룹에는 있지만 B그룹에는 없는 사람을 찾습니다.
only_a = group_a - group_b
# 또는 group_a.difference(group_b) 사용 가능
print("합집합:", all_people)
print("교집합:", common_people)
print("차집합:", only_a)
group_a | group_b: 파이프(|) 기호를 사용하여 합집합을 구합니다. 두 팀을 합쳐 하나의 큰 팀을 만드는 것과 같습니다.group_a & group_b: 앰퍼샌드(&) 기호를 사용하여 교집합을 구합니다. 양쪽 팀에 모두 소속된 ‘핵심 멤버’를 찾는 것입니다.group_a - group_b: 마이너스(-) 기호를 사용하여 차집합을 구합니다. A팀에서 B팀 멤버를 제외한 순수 A팀원만 남깁니다.
세 번째: 실무 꿀팁 - 리스트 중복 제거 마법
이건 정말 실무에서 매일 쓰이는 테크닉입니다. 리스트에 중복된 데이터가 너무 많을 때, 집합을 거쳐가면 순식간에 해결됩니다.
# 중복이 가득한 리스트가 있다고 가정해 봅시다.
raw_data = [1, 2, 2, 3, 4, 4, 4, 5, 1, 1, 6]
# 단계 1: 리스트를 set으로 변환 (이 순간 중복이 모두 사라집니다)
unique_set = set(raw_data)
# 단계 2: 다시 list로 변환 (다시 리스트 형태로 써야 하니까요)
clean_list = list(unique_set)
print("원본 데이터:", raw_data)
print("중복 제거 후:", clean_list)
set(raw_data): 리스트를 집합으로 강제 변환합니다. 집합의 특성상 중복된 숫자들은 자동으로 증발합니다.list(unique_set): 중복이 제거된 상태의 집합을 다시 리스트로 돌려놓습니다. 이제 깔끔한 데이터만 남았습니다.
실무주의보! 경고: “집합(Set)은 순서가 없습니다!”
상세 설명: 리스트는
[0]번,[1]번 이렇게 순서가 보장되지만, 집합은 내부적으로 데이터를 저장하는 방식이 다르기 때문에 출력할 때마다 순서가 바뀔 수 있습니다. 만약 중복은 제거하되 순서를 유지해야 한다면 다른 방법(예:dict.fromkeys())을 써야 합니다. “집합에 넣었는데 왜 순서가 엉망이죠?”라고 당황하지 마세요. 원래 그런 녀석입니다!
마무리하며
오늘 우리는 파이썬의 아주 강력한 도구인 딕셔너리와 집합을 배웠습니다.
- 딕셔너리는 이름표(Key)를 통해 값(Value)을 빛의 속도로 찾는 보관함이다!
- 집합은 중복을 절대 허용하지 않는 유니크한 모임이며, 합집합/교집합/차집합 연산이 가능하다!
이 두 가지만 잘 써도 여러분의 코드는 훨씬 간결해지고 효율적으로 변할 거예요. 처음에는 {}와 []가 헷갈릴 수 있겠지만, 계속 직접 코드를 쳐보면서 익히는 것이 정답입니다.
어렵게 느껴진다면 다시 한번 읽어보세요. 제가 아주 쉽게 설명해 드렸으니까 분명 이해하실 수 있을 겁니다. 그럼 다음 강의에서 더 힙하고 유용한 내용으로 돌아오겠습니다! 고생하셨습니다!
<hr>