14. 파이썬의 집합 이론: set 자료형

파이썬의 집합 이론과 set 자료형 | 지식에 대한 탐구

1. 집합(Set)이란?

집합은 수학에서 유래한 개념으로, 서로 다른 고유한 원소들의 모음을 의미합니다. 파이썬에서는 이러한 수학적 개념을 ‘set’ 자료형으로 구현하고 있습니다. set은 중복된 원소를 허용하지 않으며, 원소들 사이의 순서도 없습니다.

 

2. 파이썬에서의 Set 생성

파이썬에서 set을 생성하는 방법은 다음과 같습니다:

# 중괄호를 사용한 생성
my_set = {1, 2, 3, 4, 5}

# set() 함수를 사용한 생성
my_set = set([1, 2, 3, 4, 5])

# 중복 원소는 자동으로 제거됩니다
my_set = {1, 2, 2, 3, 4, 4, 5}  # 결과: {1, 2, 3, 4, 5}

# 주의: 빈 set 생성
empty_set = set()  # 올바른 방법
# empty_set = {}  # 이는 빈 딕셔너리를 생성합니다, set이 아님!

주의할 점은 빈 set을 생성할 때는 {}가 아닌 set()을 사용해야 한다는 것입니다. {}는 빈 딕셔너리를 생성합니다.

 

3. Set의 특징

  1. 유일성: 모든 원소는 유일합니다. 중복된 원소를 추가하려고 해도 하나만 저장됩니다.
  2. 변경 가능성: set은 mutable 객체입니다. 원소를 추가하거나 제거할 수 있습니다.
  3. 순서 없음: 원소들 사이에 순서가 없습니다. 인덱싱으로 접근할 수 없습니다.
  4. 해시 가능한 객체만 포함: set의 원소는 해시 가능해야 합니다. 따라서 list나 dictionary는 set의 원소가 될 수 없습니다.

 

4. Set 연산

set은 수학의 집합 연산을 지원합니다:

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# 합집합
print(A | B)  # 출력: {1, 2, 3, 4, 5, 6, 7, 8}

# 교집합
print(A & B)  # 출력: {4, 5}

# 차집합
print(A - B)  # 출력: {1, 2, 3}

# 대칭차집합
print(A ^ B)  # 출력: {1, 2, 3, 6, 7, 8}

 

5. Set 메서드

set은 다양한 메서드를 제공합니다:

my_set = {1, 2, 3}

# 원소 추가
my_set.add(4)
print(my_set)  # 출력: {1, 2, 3, 4}

# 원소 제거 (없으면 KeyError 발생)
my_set.remove(2)
print(my_set)  # 출력: {1, 3, 4}

# 원소 제거 (없어도 에러 발생하지 않음)
my_set.discard(5)  # 에러 발생하지 않음
print(my_set)  # 출력: {1, 3, 4}

# 임의의 원소 제거 및 반환
popped = my_set.pop()
print(popped)  # 출력: 1, 3, 4 중 하나
print(my_set)  # 출력: 남은 두 개의 원소

# 모든 원소 제거
my_set.clear()
print(my_set)  # 출력: set()

 

6. Set Comprehension

리스트 컴프리헨션과 유사하게, set도 컴프리헨션을 지원합니다:

# 0부터 9까지의 숫자의 제곱을 원소로 갖는 set 생성
squares = {x**2 for x in range(10)}
print(squares)  # 출력: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

 







 

7. frozenset

frozenset은 변경 불가능한(immutable) set입니다. 생성 후에는 원소를 추가하거나 제거할 수 없습니다.

frozen = frozenset([1, 2, 3, 4, 5])
# frozen.add(6)  # 이 코드는 AttributeError를 발생시킵니다

# frozenset은 다른 set의 원소나 딕셔너리의 키로 사용 가능
normal_set = {frozen, 1, 2, 3}
print(normal_set)  # 출력: {frozenset({1, 2, 3, 4, 5}), 1, 2, 3}

frozenset은 해시 가능하므로 다른 set의 원소나 딕셔너리의 키로 사용될 수 있습니다.

 

8. Set의 활용

set은 다음과 같은 상황에서 유용하게 사용될 수 있습니다:

1) 중복 제거

리스트에서 중복된 원소를 제거할 때 set을 활용할 수 있습니다.

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

2) 멤버십 테스트

대량의 데이터에서 특정 원소의 존재 여부를 확인할 때, set을 사용하면 리스트보다 훨씬 빠른 성능을 얻을 수 있습니다.

my_set = set(range(1000000))
print(10 in my_set)  # 출력: True (매우 빠른 연산)

3) 수학적 집합 연산

데이터 분석이나 알고리즘 문제 해결 시 집합 연산을 활용할 수 있습니다.

# 예: 두 리스트의 공통 요소 찾기
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common_elements = set(list1) & set(list2)
print(common_elements)  # 출력: {4, 5}

 

파이썬의 set 자료형은 수학의 집합 개념을 프로그래밍에 도입한 강력한 도구입니다. 중복 제거, 빠른 검색, 집합 연산 등 다양한 상황에서 유용하게 사용될 수 있습니다. 하지만 순서가 없고 mutable 객체를 포함할 수 없다는 제한사항도 있으므로, 사용 시 이러한 특성을 잘 고려해야 합니다. 적절히 활용한다면 코드의 효율성과 가독성을 크게 향상시킬 수 있을 것입니다.

© 2024 지식에 대한 탐구. All rights reserved.