내가 보려고 만든 Python의 set 활용법
Python의 유용한 데이터 구조 중 하나인 set에 대해 알아보겠습니다. 이 글에서는 set을 생성하는 방법부터 다양한 활용법을 다룰 예정입니다. (본인 공부 및 기록용) 😁
set
이란?
set
은 말 그대로 집합입니다. 중복을 허용하지 않고, 순서가 없는 데이터 구조예요. 그래서 동일한 값을 여러 번 저장할 수 없고, 요소의 순서가 중요하지 않습니다. 또한, set
은 변경 가능해서 요소를 추가하거나 제거할 수 있습니다.
set
이 주로 사용되는 상황
- 가장 흔한 사용 사례 중 하나는 데이터에서 중복을 제거하는 것입니다. 예를 들어, 리스트에 중복된 값이 있을 때 이를 제거하고 유일한 값만을 남기기 위해 set을 사용할 수 있습니다.
- 집합 연산 효율적으로 수행합니다. 주로 데이터의 비교, 필터링, 결합 등의 작업에 유용합니다.
- set은 요소의 존재 여부를 매우 빠르게 확인할 수 있습니다. 리스트나 다른 시퀀스 데이터 구조에 비해 평균적으로 O(1) 시간 복잡도로 요소의 존재를 확인할 수 있기 때문에 많은 요소들 중에서 특정 값을 빠르게 찾는 작업에 유용합니다.
# set 생성 O(n)
my_set = {1,2,3,4}
my_set = set([1,2,3,4])
# set 요소 추가 O(1)
my_set.add(5) # {1,2,3,4,5}
# set 요소 제거, 요소가 없으면 keyError 발생 O(1)
my_set.remove(5) # {1,2,3,4}
# set 요소 제거2. 요소가 없어도 에러 발생하지 않음 O(1)
my_set.discard(5) # {1,2,3,4}
# pop. 임의의 요소를 제거하고 반환 O(1)
element = my_set.pop()
# clear(). 모든 요소 제거 O(n)
my_set.clear() # {}
리스트를 set에 저장하기
리스트를 직접 set에 저장할 수는 없지만, 리스트를 튜플로 변환한 후 저장할 수 있습니다. 튜플은 변경 불가능한 데이터 타입이기 때문에 set의 요소로 사용할 수 있어요.
### list를 set에 저장 O(n*m)
# 리스트를 튜플로 변환한 후 set에 저장
list_of_lists = [[1, 2, 3], [3, 4, 5]]
# 튜플로 변환
tuple_of_tuples = tuple(tuple(inner_list) for inner_list in list_of_lists)
# set에 저장
my_set = set(tuple_of_tuples)
집합 연산
set을 사용하면 합집합, 교집합, 차집합, 대칭 차집합 등을 아주 쉽게 할 수 있습니다.
### 집합 연산
# 합집합 O(len(set1) + len(set2))
set1 = {1,2,3}
set2 = {3,4,5}
print(set1.union(set2)) # {1,2,3,4,5}
print(set1 | set2) # {1,2,3,4,5}
# 교집합 O(min(len(set1), len(set2)))
print(set1.intersection(set2)) # {3}
print(set1 & set2) # {3}
# 차집합 O(len(set1))
print(set1.difference(set2)) # {1,2}
print(set1 - set2) # {1,2}
# 대칭 차집합 O(len(set1) + len(set2))
print(set1.symmetric_difference(set2)) # {1, 2, 4, 5}
print(set1 ^ set2) #{1,2,4,5}
기타 메서드들
자주 사용되지는 않지만 사용할 줄 알면 유용한 메서드들 입니다.
# 복사 O(n)
set3 = set1.copy()
set1 = {1,2,3}
set2 = {2,3}
# 현재 집합이 주어진 집합의 부분집합인지 반환 O(len(set2))
print(set2.issubset(set1)) # True
# 현재 집합이 주어진 집합의 상위집합인지 반환 O(len(set2))
print(set1.issuperset(set2)) # True
# 두 집합이 교집합이 없는 지 반환 O(min(len(set1), len(set2)))
print(set1.isdisjoint({4,5})) # True
이것저것 공부하면서 set에 대해 새로 알게 되는 내용은 계속 추가할 예정입니다. 궁금한 것들이나 추가 및 수정했으면 좋겠는 거 말해주시면 좋을 거 같아요. 좋은 하루 보내시길 바래요 :)
댓글남기기