문제의 역사:
집합(set)은 Python 2.4부터 별도의 내장형으로 도입되었습니다(그 이전에는 외부 모듈로 구현됨). 집합은 고유하고 순서가 없는 요소를 효율적으로 저장할 수 있으며, 집합론의 여러 표준 연산인 합집합, 교집합, 차집합, 대칭 차집합 및 부분 집합 검사를 지원합니다.
문제:
set을 사용하지 않고 리스트를 사용하면 고유 요소를 찾는 데 비효율적이게 되어 많은 포함 검사가 필요한 알고리즘을 느리게 만듭니다. set은 해시 테이블을 통해 구현되므로 모든 검색, 추가 및 삭제 작업이 평균 O(1)의 시간복잡도로 수행됩니다. 그러나 이 구조는 예기치 않은 문제를 일으킬 수 있습니다. 예를 들어, 요소의 순서가 소실되거나, 요소 유형에 대한 제약(변경 불가능하고 해시 가능해야 함)이 있으며, 집합의 비교 및 다른 구조와의 상호작용을 이해하는 데 어려움이 있습니다.
해결책:
고유한 요소만 저장하고 집합론 연산을 수행해야 할 때 set을 사용해야 합니다. 요소는 반드시 해시 가능해야 합니다(예: 숫자, 문자열, tuple, 그러나 리스트나 dict는 아니어야 함). set에는 풍부한 내장 메서드 세트가 제공됩니다 (add, remove, union, intersection, difference, issubset 등).
코드 예시:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (합집합) print(s1 & s2) # {3, 4} (교집합) print(s1 - s2) # {1, 2} (차집합) print(3 in s1) # True (포함 검사)
주요 특징:
변경 가능한 유형(예: 리스트)을 set에 추가할 수 있나요?
아니요, 집합의 요소는 해시 가능하고 변경 불가능해야 합니다. 리스트나 dict를 set에 추가할 수 없으며 Python은 TypeError를 발생시킵니다.
s = set() s.add([1, 2, 3]) # TypeError: unhashable type: 'list'
set이 요소의 순서를 유지하나요?
아니요. set이 생성된 이후로 요소는 추가된 순서대로 보장되지 않으며, 특히 집합의 크기를 변경할 때 더욱 그렇습니다.
s = {5, 2, 8, 1} print(s) # 순서는 정의되지 않음
set과 frozenset의 차이점은 무엇이며, frozenset을 set의 요소로 사용할 수 있나요?
frozenset은 set의 변경 불가능한 버전입니다. 이는 다른 set의 요소나 dict의 키로 사용할 수 있습니다. 왜냐하면 frozenset은 해시 가능하기 때문입니다.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
개발자가 고유 요소를 저장하려고 set을 선택했지만, 요소의 순서를 고려하지 않았습니다. 그 결과, 처리 순서에 의존하는 비즈니스 로직이 작동하지 않게 되었습니다.
장점:
단점:
대규모 세트에서 고유한 레코드를 빠르게 필터링하는 작업에서 set이 선택되었습니다. 왜냐하면 순서가 아니라 고유성의 사실이 중요했기 때문입니다. 성능이 크게 향상되었고, 코드가 간소화되었습니다.
장점:
단점: