파이썬 - 집합

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘은 파이썬의 멋진 집합 세계에 몸을 던지게 될 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 선생님으로서, 이 여정을 안내해드리게 되어 기쁩니다. 그럼, 좋아하는 음료를 준비하고 편하게 앉아서 함께 집합을 탐험해보겠습니다!

Python - Sets

파이썬의 집합

색종이 볼을 가지고 있는 것을 상상해보세요. 각 볼은 독특하고, 그들이 어떤 순서로 있던 상관없이 - 여러분이 어떤 색상을 가지고 있는지 알고 싶을 때입니다. 이것이 파이썬에서 집합이란 것과 매우 유사합니다!

집합은 고유 요소들의 순서 없는 모음입니다. 수학적 집합과 비슷하게, 중복이 허용되지 않고, 순서는 중요하지 않습니다. 집합은 고유한 항목을 저장하거나 합집합, 교집합, 차집합과 같은 집합 연산을 수행할 필요가 있을 때 매우 유용합니다.

파이썬에서 집합 생성

첫 번째 집합을 생성하려면 다음과 같은 두 가지 주요 방법이 있습니다:

  1. 중괄호 {}를 사용합니다.
  2. set() 생성자를 사용합니다.

다음은 두 가지 방법의 예입니다:

# 방법 1: 중괄호 사용
과일 = {'사과', '바나나', '체리'}

# 방법 2: set() 생성자 사용
색상 = set(['적', '초록', '파랑'])

print(과일)
print(색상)

출력:

{'사과', '체리', '바나나'}
{'파랑', '적', '초록'}

정의한 것과는 다르게 출력에서 요소들의 순서가 다를 수 있습니다. 이는 집합이 순서 없기 때문입니다!

집합의 중복 요소

집합은 고유한 요소들만 포함한다고 했었습니다. 중복을 추가해보면 어떻게 될까요?

숫자 = {1, 2, 3, 2, 4, 3, 5}
print(숫자)

출력:

{1, 2, 3, 4, 5}

보시죠, 파이썬이 자동으로 중복을 제거해줍니다. 멋지지 않나요?

집합에 요소 추가

단일 요소를 집합에 추가하려면 add() 메서드를 사용합니다. 여러 요소를 한 번에 추가하려면 update() 메서드를 사용합니다.

# 단일 요소 추가
과일.add('오렌지')
print(과일)

# 여러 요소 추가
과일.update(['포도', '망고'])
print(과일)

출력:

{'사과', '체리', '바나나', '오렌지'}
{'사과', '망고', '체리', '바나나', '오렌지', '포도'}

집합에서 요소 제거

집합에서 요소를 제거하는 방법이 여러 가지 있습니다. 몇 가지를 탐험해보겠습니다:

# remove() 사용 - 요소가 없으면 에러 발생
과일.remove('바나나')

# discard() 사용 - 요소가 없어도 에러 발생하지 않음
과일.discard('키위')

# pop() 사용 - 임의의 요소를 제거하고 반환
제거된_요소 = 과일.pop()
print(f"제거된 요소: {제거된_요소}")

# clear() 사용 - 모든 요소 제거
과일.clear()

print(과일)

출력:

제거된 요소: 체리
set()

집합의 멤버십 테스트

집합의 큰 장점 중 하나는 매우 빠른 멤버십 테스트를 허용합니다. in 키워드를 사용하여 요소가 집합에 존재하는지 확인할 수 있습니다:

숫자 = {1, 2, 3, 4, 5}
print(3 in 숫자)  # True
print(6 in 숫자)  # False

이 작업은 집합보다 리스트가 훨씬 빠르게 수행됩니다, 특히 큰 모음일 때!

집합 연산

파이썬의 집합은 다양한 수학적 집합 연산을 지원합니다. 몇 가지를 살펴보겠습니다:

집합1 = {1, 2, 3, 4, 5}
집합2 = {4, 5, 6, 7, 8}

# 합집합
print(집합1 | 집합2)  # 또는 집합1.union(집합2)

# 교집합
print(집합1 & 집합2)  # 또는 집합1.intersection(집합2)

# 차집합
print(집합1 - 집합2)  # 또는 집합1.difference(집합2)

# 대칭 차집합
print(집합1 ^ 집합2)  # 또는 집합1.symmetric_difference(집합2)

출력:

{1, 2, 3, 4, 5, 6, 7, 8}
{4, 5}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

파이썬 집합 컴프리헨션

리스트 컴프리헨션과 마찬가지로, 파이썬은 집합 컴프리헨션도 지원합니다. 이는 기존의 이터러블 객체를 기반으로 집합을 생성하는 간결한 방법을 제공합니다.

# 0에서 9까지의 숫자의 제곱을 포함하는 집합 생성
제곱 = {x**2 for x in range(10)}
print(제곱)

출력:

{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

집합 컴프리헨션을 사용한 요소 필터링

집합 컴프리헨션을 사용하여 요소를 필터링할 수도 있습니다:

# 0에서 9까지의 짝수 제곱을 포함하는 집합 생성
짝수_제곱 = {x**2 for x in range(10) if x % 2 == 0}
print(짝수_제곱)

출력:

{0, 4, 16, 36, 64}

중첩된 집합 컴프리헨션

덜 일반적이지만, 중첩된 집합 컴프리헨션도 가능합니다:

# (x, y) 형태의 튜플을 포함하는 집합 생성, x와 y는 숫자
숫자_쌍 = {(x, y) for x in range(3) for y in range(3)}
print(숫자_쌍)

출력:

{(0, 1), (1, 2), (0, 0), (2, 0), (1, 1), (2, 2), (0, 2), (2, 1), (1, 0)}

동결 집합

마지막으로, 동결 집합에 대해 이야기해봅시다. 동결 집합은 파이썬 집합 객체의 불변 버전입니다. 집합의 요소는 언제든지 수정할 수 있지만, 동결 집합의 요소는 생성 후에는 변하지 않습니다.

정상_집합 = {1, 2, 3}
동결_집합 = frozenset([1, 2, 3])

정상_집합.add(4)  # 이 작업은 작동합니다
# 동결_집합.add(4)  # 이 작업은 AttributeError를 발생시킵니다

동결 집합은 불변 집합이 필요할 때, 예를 들어 딕셔너리의 키로 사용할 때 매우 유용합니다.

그리고 여기까지! 우리는 파이썬 집합의 모든 것을 다루었습니다. 기억해두세요, 연습이 실력을 만든다는 말이 있습니다. 이러한 개념들을 실험해보세요. 코딩을 즐겁게!

다음은 우리가 논의한 주요 집합 메서드를 요약한 표입니다:

메서드 설명
add() 집합에 요소를 추가합니다
update() 집합에 여러 요소를 추가합니다
remove() 특정 요소를 집합에서 제거합니다 (없으면 에러 발생)
discard() 특정 요소를 집합에서 제거합니다 (없어도 에러 발생하지 않음)
pop() 임의의 요소를 제거하고 반환합니다
clear() 모든 요소를 제거합니다
union() 합집합을 반환합니다
intersection() 교집합을 반환합니다
difference() 차집합을 반환합니다
symmetric_difference() 양쪽 집합에 존재하는 요소를 제외한 요소들의 집합을 반환합니다

Credits: Image by storyset