Set
set은 순서가 없고, 중복을 허용하지 않는 데이터 구조입니다. 수학적 집합의 개념을 기반으로 하며, 데이터 정리 및 비교 작업에서 효율적으로 사용됩니다.
1. 특징
중복 허용하지 않음 |
동일한 값이 여러 번 추가되더라도 하나의 요소만 유지. |
{1, 2, 2, 3} → {1, 2, 3} |
순서 없음 |
요소의 위치가 정해져 있지 않으며, 순서가 보장되지 않음. |
{3, 1, 2} → 출력 순서: {1, 2, 3} (랜덤 배치 가능) |
가변 객체 |
요소를 추가(add)하거나 제거(remove)할 수 있음. |
s.add(4) → {1, 2, 3, 4} |
효율적 멤버십 테스트 |
in 연산을 통해 O(1) 시간 복잡도로 요소 검색 가능. |
4 in {1, 2, 3} → False |
해시 가능성 |
리스트, 딕셔너리와 같은 가변 객체는 저장할 수 없음. |
s.add([1, 2, 3]) → TypeError |
2. 사용 사례
2.1 중복 제거
- 리스트나 다른 컬렉션에서 중복된 값을 제거할 때 유용.
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = set(data)
print(unique_data) # {1, 2, 3, 4, 5}
2.2 집합 연산
- set은 수학적 집합 연산(합집합, 교집합, 차집합)을 효율적으로 지원.
# 두 학생 집합에서 공통 학생 추출 (교집합)
students_1 = {"Alice", "Bob", "Charlie"}
students_2 = {"Bob", "Diana", "Charlie"}
common_students = students_1.intersection(students_2)
print(common_students) # {'Charlie', 'Bob'}
2.3 효율적인 검색
- set은 해시 기반 자료구조로, 요소의 존재 여부를 빠르게 확인할 수 있음.
ids = {101, 102, 103}
print(101 in ids) # True
print(105 in ids) # False
2.4 데이터 비교
- 두 데이터셋의 차이를 계산하거나 공통되지 않은 데이터를 추출할 때 유용.
# 구매하지 않은 항목 찾기
all_items = {"apple", "banana", "cherry"}
purchased = {"banana", "cherry"}
not_purchased = all_items.difference(purchased)
print(not_purchased) # {'apple'}
3. 주요 메서드와 활용
add(x) |
요소 x를 추가 |
s.add(4) → {1, 2, 3, 4} |
remove(x) |
요소 x를 제거 (존재하지 않으면 KeyError) |
s.remove(3) → {1, 2} |
discard(x) |
요소 x를 제거 (존재하지 않아도 에러 없음) |
s.discard(5) |
union(set2) |
두 집합의 합집합 반환 |
{1, 2}.union({3, 4}) → {1, 2, 3, 4} |
intersection(set2) |
두 집합의 교집합 반환 |
{1, 2}.intersection({2, 3}) → {2} |
difference(set2) |
첫 번째 집합에서 두 번째 집합 요소 제거 |
{1, 2, 3}.difference({2}) → {1, 3} |
isdisjoint(set2) |
두 집합이 공통 요소가 없는지 확인 |
{1, 2}.isdisjoint({3, 4}) → True |
4. 실전 활용 예제
4.1 중복 제거 및 정리
- 대량의 데이터에서 중복을 제거하여 고유한 값만 남김.
emails = ["test@example.com", "user@example.com", "test@example.com"]
unique_emails = set(emails)
print(unique_emails) # {'user@example.com', 'test@example.com'}
4.2 집합 연산
# 두 집합의 합집합
odd = {1, 3, 5, 7}
even = {2, 4, 6, 8}
union_set = odd.union(even)
print(union_set) # {1, 2, 3, 4, 5, 6, 7, 8}
# 교집합
intersection_set = odd.intersection({1, 2, 3})
print(intersection_set) # {1, 3}
4.3 효율적인 데이터 검색
valid_ids = {1001, 1002, 1003, 1004}
input_id = 1003
if input_id in valid_ids:
print("유효한 ID입니다.")
else:
print("유효하지 않은 ID입니다.")
5. 주의점
- 순서가 없음:
- set은 순서를 보장하지 않으므로 출력 순서가 일정하지 않을 수 있음.
- 중복 제거:
- 동일한 값이 여러 번 추가되더라도 하나의 요소만 유지.
- 해시 가능성:
- 가변 객체(리스트, 딕셔너리 등)는 set의 요소로 사용할 수 없음.
s = set()
s.add([1, 2, 3]) # TypeError 발생
- remove()와 discard() 차이:
- remove(): 제거하려는 요소가 없으면 KeyError 발생.
- discard(): 요소가 없더라도 에러 없이 진행.