Python의 딕셔너리와 집합
dict와 set의 생성, 멤버십 검사, collections.Counter로 빈도를 세는 일반적인 패턴을 살펴봅니다.
Python의 딕셔너리와 집합은(는) CoddyKit의 무료 DSA Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 DSA Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. DSA Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
파이썬 딕셔너리: 키-값 저장소
파이썬 딕셔너리는 키를 값에 연결하며, 평균적으로 조회, 삽입, 삭제를 O(1)에 수행합니다. 두 수의 합 문제, 애너그램 검사, 빈도 계산의 핵심 도구입니다. 코드에서 사용법을 보여 줍니다.
d = {'apple': 3, 'banana': 5}
print(d['apple']) # 3
d['cherry'] = 7
print(len(d)) # 3
print('banana' in d) # True
del d['apple']
print(d) # {'banana': 5, 'cherry': 7}.get()을 사용한 안전한 조회
없는 키를 d[key]로 읽으면 KeyError가 발생합니다. 대신 d.get(key, default)를 사용해 대체값을 반환하십시오. 예상하지 못한 실행 시간 오류를 피할 수 있는 안전한 습관입니다.
freq = {}
words = ['the', 'cat', 'sat', 'on', 'the', 'mat']
for w in words:
freq[w] = freq.get(w, 0) + 1
print(freq)
# {'the': 2, 'cat': 1, 'sat': 1, 'on': 1, 'mat': 1}
print(freq.get('dog', 0)) # 0 (no KeyError)더 깔끔한 그룹화를 위한 defaultdict
defaultdict(list)는 새로운 키마다 빈 리스트를 자동으로 만들므로 그룹화 문제에서 반복적인 준비 코드를 없애 줍니다. defaultdict(int)는 모든 키를 0에서 시작하게 하므로 쉽게 개수를 셀 수 있습니다.
from collections import defaultdict
groups = defaultdict(list)
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
for w in words:
key = ''.join(sorted(w)) # canonical anagram key
groups[key].append(w)
print(list(groups.values()))
# [['eat','tea','ate'], ['tan','nat'], ['bat']]Counter: 빠른 빈도 맵
Counter는 개수 세기에 맞게 만들어진 딕셔너리입니다. 어떤 반복 가능한 객체든 전달하면 즉시 빈도 맵을 얻을 수 있습니다. most_common(k)는 상위 k개를 반환합니다. 코드에서 애너그램 검사를 보여 줍니다.
from collections import Counter
c = Counter('abracadabra')
print(c) # Counter({'a':5,'b':2,'r':2,'c':1,'d':1})
print(c.most_common(2)) # [('a', 5), ('b', 2)]
# Valid anagram check
def is_anagram(s, t):
return Counter(s) == Counter(t)
print(is_anagram('anagram', 'nagaram')) # True파이썬 집합: 순서가 없고 중복이 없는 모음
집합은 중복되지 않는 항목을 저장하며 포함 여부 검사를 O(1)에 수행합니다. {1, 2, 3} 또는 set(iterable)을 사용하십시오. 단, {}는 딕셔너리를 만들므로 빈 집합에는 set()을 사용해야 합니다. 중복을 찾는 데 매우 유용합니다.
seen = set()
nums = [1, 2, 3, 2, 1, 4]
duplicates = []
for n in nums:
if n in seen: # O(1) check
duplicates.append(n)
seen.add(n)
print(duplicates) # [2, 1]
print(len(seen)) # 4 (unique values)면접을 위한 집합 연산
집합은 수학 연산을 지원합니다. |는 합집합, &는 교집합, -는 차집합, ^는 대칭 차집합입니다. 이러한 연산을 사용하면 "공통 원소" 유형의 문제를 한 줄로 해결할 수 있습니다.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # {1, 2, 3, 4, 5, 6} union
print(a & b) # {3, 4} intersection
print(a - b) # {1, 2} difference
print(a ^ b) # {1, 2, 5, 6} symmetric diff포함 여부 검사: 리스트와 집합 비교
선택하는 자료 구조에 따라 속도가 달라집니다. 리스트에서 in으로 확인하면 O(n)이지만, 집합에서는 O(1)입니다. 반복해서 조회해야 한다면 먼저 리스트를 집합으로 변환하는 것이 흔한 성능 향상 방법입니다.
word_list = ['apple', 'banana', 'cherry', 'date']
word_set = set(word_list)
# O(n) per check
print('banana' in word_list) # True
# O(1) per check
print('banana' in word_set) # True
# Practical example: find common elements
a = [1, 2, 3, 4, 5]
b = [3, 4, 5, 6, 7]
common = [x for x in a if x in set(b)]
print(common) # [3, 4, 5]딕셔너리 순회: 키, 값, 항목
.keys(), .values(), .items()를 사용해 딕셔너리를 순회하십시오. 반복문 중간에 키를 삭제하지 마십시오. 먼저 키를 리스트에 모은 다음 순회가 끝난 뒤 삭제해야 합니다. 코드를 확인해 보십시오.
scores = {'Alice': 90, 'Bob': 75, 'Carol': 88}
for name, score in scores.items():
print(f'{name}: {score}')
# Find key with max value
best = max(scores, key=scores.get)
print(best) # Alice
# Safe deletion
to_del = [k for k, v in scores.items() if v < 80]
for k in to_del:
del scores[k]
print(scores) # {'Alice': 90, 'Carol': 88}frozenset: 해시 가능한 집합
frozenset은 변경할 수 없는 집합이므로 딕셔너리 키가 되거나 다른 집합 안에 들어갈 수 있습니다. 순서가 중요하지 않을 때 문자 집합으로 애너그램을 그룹화하는 데 유용합니다.
from collections import defaultdict
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
groups = defaultdict(list)
for w in words:
key = frozenset(w) # hashable; 'eat','tea','ate' all share same key
groups[key].append(w)
print([sorted(g) for g in groups.values()])
# [['ate','eat','tea'], ['nat','tan'], ['bat']]변환을 위한 딕셔너리 컴프리헨션
딕셔너리 컴프리헨션은 한 줄로 매핑을 만듭니다. {k: v for ...}와 같은 형태입니다. 딕셔너리를 뒤집거나 쌍을 필터링할 때 유용합니다. 단, 뒤집으려면 값이 고유하다고 가정해야 합니다. 코드를 확인해 보십시오.
# Invert a dict
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
print(inverted) # {1:'a', 2:'b', 3:'c'}
# Filter by value
scores = {'Alice': 90, 'Bob': 55, 'Carol': 78}
passing = {k: v for k, v in scores.items() if v >= 60}
print(passing) # {'Alice': 90, 'Carol': 78}가장 긴 연속 수열
집합을 사용하면 가장 긴 연속 수열 문제를 O(n)에 해결할 수 있습니다. 모든 수를 집합에 넣은 다음, 바로 앞 수가 없는 수에서만 세기를 시작하면 됩니다. 정렬은 필요하지 않습니다.
def longest_consecutive(nums):
num_set = set(nums)
best = 0
for n in num_set:
if n - 1 not in num_set: # start of sequence
cur = n
streak = 1
while cur + 1 in num_set:
cur += 1
streak += 1
best = max(best, streak)
return best
print(longest_consecutive([100,4,200,1,3,2])) # 4 (1,2,3,4)간단한 확인
간단히 확인해 보겠습니다. 이번 레슨에서 배운 딕셔너리와 집합의 개념을 얼마나 잘 익혔는지 살펴보십시오. 여기서는 자신의 직감을 믿으십시오. 🎯
레슨 요약
요약하면, 딕셔너리는 개수 세기와 그룹화를 위한 O(1) 조회를 제공하고, Counter와 defaultdict는 반복적인 준비 코드를 줄여 주며, 집합은 O(n) 탐색을 O(1) 검사로 바꿔 줍니다.
자주 묻는 질문
“Python의 딕셔너리와 집합” 강의는 무료인가요?
네 — “Python의 딕셔너리와 집합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 DSA Interview Prep 강의 전체를 잠금 해제할 수 있습니다. DSA Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“Python의 딕셔너리와 집합”에서 뭘 배우나요?
dict와 set의 생성, 멤버십 검사, collections.Counter로 빈도를 세는 일반적인 패턴을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 DSA Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
DSA Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 DSA Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Python의 딕셔너리와 집합” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 DSA Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 DSA Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 리스트, 튜플, 슬라이싱
- Python의 딕셔너리와 집합
- 컴프리헨션과 내장 함수
- 함수, 클로저, 람다