Python Sets
Introduction to Python Sets
안녕하세요, 코딩 푸는 남자 입니다.
오늘은 Python의 기본 객체중 Set 객체를 알아 보도록 하겠습니다.
Set 객체는 한국말로 하면 집합의 개념 입니다.
List처럼 순서가 있거나, Dictionary처럼 Key로 색인을 하는 경우가 아닌 경우 사용 가능 합니다.
우선 Set 객체에 대해 간단히 알아 보겠습니다.
Creating a Set
Set는 다음과 같이 두가지 방법을 이용해서 생성 가능 합니다.
# Using curly braces
fruits = {"apple", "banana", "cherry"}
# Using the set() function
colors = set(["red", "green", "blue"])
Note: Set에서 사용하는 element들은 중복이 불가능 합니다. 만약 중복 element를 생성하면, Set가 자동으로 중복을 제거 합니다. 이에 대해서는 후에 자세히 알아 보도록 하겠습니다.
Basic Set Operations
Adding Elements
add() method를 통해 신규 element를 추가 할 수 있습니다.
fruits.add("orange")
Removing Elements
제거하기 위해서는 remove() 혹은 discard() method 두가지가 이용 가능하며, 차이점은 아래와 같습니다.
fruits.remove("banana") # Raises an error if 'banana' is not present
fruits.discard("banana") # Does not raise an error if 'banana' is not present
Set Operations
Set 객체는 교집합 (&), 합집합 (|) , 차집합 (-) 과 같은 operation이 지원 됩니다.
a = {1, 2, 3}
b = {3, 4, 5}
# Union
print(a | b) # Output: {1, 2, 3, 4, 5}
# Intersection
print(a & b) # Output: {3}
# Difference
print(a - b) # Output: {1, 2}
Set객체의 한계점
- Unordered Nature
Set는 element들을 순차적으로 저장하지 않습니다. 따라서 Index나 Slicing등은 지원하지 않습니다.
또한 이러 특성으로, 다음과 같이 set element를 출력하는 경우, 순서가 항상 동일하지 않을수 있습니다.
my_set = {1, 2, 3, 4, 5}
for element in my_set:
print(element)
그럼 어떤 경우에 Set 객체를 사용하면 좋을까요?
- Uniqueness:
Set객체는 element가 중복되는 경우 자동으로 중복을 제거 하는 특징을 가지고 있습니다.
즉 각 element는 하나의 Set안에서 유일합니다.
Set의 이러한 특징을 이용해서 다음과 같은 코드가 가능합니다.
example:
# Original list with duplicates
my_list = [1, 2, 2, 3, 4, 4, 5, 5, 5, 6]
# Removing duplicates by converting the list to a set
unique_set = set(my_list)
# Converting back to a list
unique_list = list(unique_set)
print("Original List:", my_list) # Output: [1, 2, 2, 3, 4, 4, 5, 5, 5, 6]
print("List with Duplicates Removed:", unique_list) # Output: [1, 2, 3, 4, 5, 6]
List를 Set로 변환후 다시 List로 변환하면, 간단히 중복이 모두 제거된 List를 만들수 있습니다.
- Efficiency:
특정 element가 List나 Set안에 포함되어 있는지 판단 하기 위해서는 List보다 Set가 훨씬 효율적 입니다.
# Large list and set for comparison
total_element = 100000000
large_list = list(range(total_element))
large_set = set(large_list)
# Testing membership
search_element = total_element - 1
# Timing membership testing in the list
import time
start_time = time.time()
result_list = search_element in large_list
end_time = time.time()
list_search_time = end_time - start_time
# Timing membership testing in the set
start_time = time.time()
result_set = search_element in large_set
end_time = time.time()
set_search_time = end_time - start_time
print(f"Time taken for list: {list_search_time:.6f} seconds")
print(f"Time taken for set: {set_search_time:.6f} seconds")
# result : Time taken for list: 11.086122 seconds
# result : Time taken for set: 0.000000 seconds
이 코드를 실행해 보시면, List의 경우 total_element의 수에 비례하여 소요 시간은 늘어나지만, Set는 그렇지 않다는 것을 확인 할 수 있습니다.
List는 element를 검색할때 그 요소의 처음부터 순차적으로 검색하여, O(n) 복잡도를 가지지만, 집합은 해시 테이블을 사용하여 구현됩니다.
요소가 집합에 추가될 때 파이썬은 요소의 해시를 계산하고 해시 테이블에 저장합니다. 이 해시는 요소에 빠르게 액세스하는 데 사용됩니다. 따라서 해싱으로 인한 검색은 O(1)의 시간 복잡도를 가지며, 집합의 크기와 관계없이 일정하다는 것을 의미합니다.
- Mathematical Operations:
앞서 살펴본 바와 같이, Set 객체는 집합 연산을 지원 합니다.
Operations:
- Union (|): 합집합
- Intersection (&): 교집합
- Difference (-): 차집합
- Symmetric Difference (^): 두 Set 안에 모두 포함하는 element만 제거
- Example:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
union_set = set_a | set_b
print(union_set) # Output: {1, 2, 3, 4, 5}
intersection_set = set_a & set_b
print(intersection_set) # Output: {3}
difference_set = set_a - set_b
print(difference_set) # Output: {1, 2}
symmetric_difference_set = set_a ^ set_b
print(symmetric_difference_set) # Output: {1, 2, 4, 5}
Set와 List 객체의 형 변환
List와 Set는 그 목적에 맞게 다음과 같이 서로 변경이 가능 합니다.
my_list = [1, 2, 2, 3, 4, 4, 5]
my_set = set(my_list)
print(my_set) # Output: {1, 2, 3, 4, 5}
my_set = {1, 2, 3, 4, 5}
my_list = list(my_set)
print(my_list) # Output: [1, 2, 3, 4, 5]
Conclusion
오늘은 Python의 Set 객체에 대해 알아 보았습니다.
감사합니다.