본문 바로가기
프로그래밍/파이썬

파이썬 - Set

by ennak 2024. 11. 29.
반응형

Intro

파이썬의 집합(Set)은 수학적 집합 개념을 구현한 자료구조로, 중복되지 않은 요소들의 모음이다.
집합은 리스트나 튜플과 달리 순서가 없고, 인덱싱을 지원하지 않는다.
하지만 빠른 멤버십 테스트와 중복 제거 기능으로 많은 상황에서 유용하게 사용된다.

 

1. 집합 생성

집합을 생성하는 방법은 여러 가지가 있다.

a) 중괄호 사용

my_set = {1, 2, 3, 4, 5}

b) set() 함수 사용

my_set = set([1, 2, 3, 4, 5])

c) 집합 컴프리헨션

my_set = {x for x in range(10) if x % 2 == 0}

 

주의할 점은 빈 집합을 생성할 때 중괄호만 사용하면 딕셔너리가 생성된다.
빈 집합을 만들려면 set() 함수를 사용해야 한다.

empty_set = set()  # 빈 집합
empty_dict = {}    # 빈 딕셔너리

 

2. 기본 집합 연산

집합은 수학적 집합 연산을 지원한다

a) 합집합 (Union)

set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1 | set2  # 또는 set1.union(set2)
print(union_set)  # 출력: {1, 2, 3, 4, 5}

b) 교집합 (Intersection)

intersection_set = set1 & set2  # 또는 set1.intersection(set2)
print(intersection_set)  # 출력: {3}

c) 차집합 (Difference)

difference_set = set1 - set2  # 또는 set1.difference(set2)
print(difference_set)  # 출력: {1, 2}

d) 대칭 차집합 (Symmetric Difference)

symmetric_difference_set = set1 ^ set2  # 또는 set1.symmetric_difference(set2)
print(symmetric_difference_set)  # 출력: {1, 2, 4, 5}

 

3. 집합 메서드

집합은 다양한 메서드를 제공한다.

a) add(element): 요소 추가

my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # 출력: {1, 2, 3, 4}

b) remove(element): 요소 제거 (요소가 없으면 KeyError 발생)

my_set.remove(2)
print(my_set)  # 출력: {1, 3, 4}

c) discard(element): 요소 제거 (요소가 없어도 에러 발생하지 않음)

my_set.discard(5)  # 에러 발생하지 않음

d) pop(): 임의의 요소를 제거하고 반환

element = my_set.pop()
print(element)  # 임의의 요소 출력

e) clear(): 모든 요소 제거

my_set.clear()
print(my_set)  # 출력: set()

 

4. 집합 관계 연산

집합 간의 관계를 확인하는 메서드들도 있다.

a) issubset(other): 부분집합 여부 확인

set1 = {1, 2}
set2 = {1, 2, 3, 4}
print(set1.issubset(set2))  # 출력: True

b) issuperset(other): 상위집합 여부 확인

print(set2.issuperset(set1))  # 출력: True

c) isdisjoint(other): 두 집합이 공통 요소가 없는지 확인

set3 = {5, 6}
print(set1.isdisjoint(set3))  # 출력: True

5. 불변 집합 (Frozenset)

frozenset은 변경할 수 없는 집합이다. 일반 집합과 달리 요소를 추가하거나 제거할 수 없다.

frozen = frozenset([1, 2, 3])
# frozen.add(4)  # AttributeError 발생

 

frozenset은 딕셔너리의 키나 다른 집합의 요소로 사용할 수 있다.

6. 집합 컴프리헨션

리스트 컴프리헨션과 유사하게, 집합 컴프리헨션을 사용하여 간결하게 집합을 생성할 수 있다.

squares = {x**2 for x in range(10)}
print(squares)  # 출력: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

7. 집합의 성능 특성

집합은 해시 테이블을 기반으로 구현되어 있어, 멤버십 테스트, 추가, 제거 연산이 평균적으로 O(1)의 시간 복잡도를 가진다.
이는 리스트나 튜플에 비해 매우 빠른 성능을 제공한다.

large_set = set(range(1000000))
print(10 in large_set)  # 매우 빠르게 True 출력

8. 집합을 이용한 알고리즘 최적화

집합의 빠른 멤버십 테스트 특성을 이용하여 알고리즘을 최적화할 수 있다.

def has_duplicate(sequence):
    seen = set()
    for item in sequence:
        if item in seen:
            return True
        seen.add(item)
    return False

print(has_duplicate([1, 2, 3, 4, 5, 1]))  # 출력: True

9. 다중 집합 연산

여러 집합에 대한 연산을 한 번에 수행할 수 있다.

set1 = {1, 2, 3}
set2 = {3, 4, 5}
set3 = {5, 6, 7}

union_all = set.union(set1, set2, set3)
print(union_all)  # 출력: {1, 2, 3, 4, 5, 6, 7}

intersection_all = set.intersection(set1, set2, set3)
print(intersection_all)  # 출력: set()

 

10. 집합을 이용한 고유 요소 추출

리스트에서 중복을 제거하고 고유한 요소만 추출하는 데 집합을 활용할 수 있다.

my_list = [1, 2, 2, 3, 4, 4, 5]
unique_elements = list(set(my_list))
print(unique_elements)  # 출력: [1, 2, 3, 4, 5]

 

11. 집합의 메모리 효율성

집합은 해시 테이블을 사용하기 때문에, 많은 수의 고유한 요소를 저장할 때 메모리 효율적이다.

import sys

list_of_numbers = list(range(1000))
set_of_numbers = set(range(1000))

print(sys.getsizeof(list_of_numbers))  # 더 큰 크기
print(sys.getsizeof(set_of_numbers))   # 더 작은 크기

 

12. 집합을 이용한 데이터 필터링

집합의 차집합 연산을 이용하여 데이터를 필터링할 수 있다.

all_users = {'Alice', 'Bob', 'Charlie', 'David'}
active_users = {'Alice', 'Charlie', 'Eve'}

inactive_users = all_users - active_users
print(inactive_users)  # 출력: {'Bob', 'David'}

 

13. 집합의 불변성과 가변성

일반 집합(set)은 가변(mutable)이지만, frozenset은 불변(immutable)이다. 이 특성을 이용하여 안전한 데이터 구조를 만들 수 있다.

def process_data(data):
    # data를 변경할 수 없게 만듦
    immutable_data = frozenset(data)
    # 처리 로직...
    return some_result

original_data = {1, 2, 3}
result = process_data(original_data)
print(original_data)  # 원본 데이터가 변경되지 않음

 

14. 집합을 이용한 그래프 표현

집합을 사용하여 간단한 그래프 구조를 표현할 수 있다.

graph = {
    'A': {'B', 'C'},
    'B': {'A', 'D', 'E'},
    'C': {'A', 'F'},
    'D': {'B'},
    'E': {'B', 'F'},
    'F': {'C', 'E'}
}

print(graph['A'])  # A의 이웃 노드 출력: {'B', 'C'}

 

15. 집합의 정렬

집합은 기본적으로 정렬되지 않지만, 필요한 경우 정렬된 리스트로 변환할 수 있다.

my_set = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}
sorted_list = sorted(my_set)
print(sorted_list)  # 출력: [1, 2, 3, 4, 5, 6, 9]
반응형