끝나지 않는 프로그래밍 일기

1. 집합(Set)

파이썬에서는 집합에 관한 자료형을 제공합니다.

집합 객체를 만드는 방법은 중괄호로 감싸고, 각 요소들은 쉼표(,)로 구분합니다.

>>> A = {1, 2, 3, 4}
>>> type(A)
<class 'set'>

빈 집합을 만들때는 아래와 같이 set 함수를 통해서 만들게 됩니다.

>>> empty_set = set()
>>> type(empty_set)
<class 'set'>
>>> empty_set
set()

그러나 아래와 같이 중괄호를 사용하여 빈 집합을 만들 수는 없습니다. 아래 예제와 같이 중괄호를 사용하면 파이썬은 빈 사전 객체를 만들게 됩니다. 이는 위 예제에서 empty_set을 {}로 나타내는 게 아니라 set()로 나타내는 이유와 동일합니다.

>>> B = {}
>>> type(B)
<class 'dict'>

집합 객체에는 순서가 있을까요? 사전과 같이 집합에도 순서가 없습니다. 간혹, 자신이 만든 집합의 내용을 확인하려고 출력했을 때 예상했던 결과값과 확실히 다른 것을 확인할 수 있습니다.

>>> A = {5, 6, 7, 8, 9}
>>> A
{8, 9, 5, 6, 7}
그리고 집합도 사전과 같이 중복을 허용하지 않습니다.
>>> A = {2, 5, 5, 7, 8, 8, 9}
>>> A
{8, 9, 2, 5, 7}
2. frozenset
만약에 변경 불가능한 집합을 만드려면 어떻게 해야 할까요? 바로 frozenset을 이용하면 됩니다. 변경이 불가능하다는 점만 빼면 파이썬의 set와 같습니다.
>>> a = frozenset([1, 2, 3, 4]) # frozenset({1, 2, 3, 4})로도 쓸 수 있음
>>> a
frozenset({1, 2, 3, 4})
>>> a.add(5)
Traceback (most recent call last):
  File "", line 1, in 
	a.add(5)
AttributeError: 'frozenset' object has no attribute 'add'

3. 집합의 다양한 함수 살펴보기

이번에는 집합에 관한 함수에 대해 살펴보도록 하겠습니다.


  교집합을 구하는 함수 intersection

>>> A = {1, 3, 5, 7, 9}
>>> B = {3, 6, 9, 12, 15}
>>> A & B
{9, 3}
>>> A.intersection(B)
{9, 3}

위 예제에서는 & 연산자(set intersection operator)와 intersection 함수를 사용하여 A와 B 두 집합의 교집합을 구한 결과를 볼 수 있습니다. 


  합집합을 구하는 함수 union

>>> A = {1, 3, 5, 7, 9}
>>> B = {2, 4, 6, 8, 10}
>>> A | B
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
>>> A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

이번 예제에서는 | 연산자와 union 함수를 사용하여 A와 B 두 집합의 합집합을 구한 결과를 볼 수 있습니다.


  차집합을 구하는 함수 difference

>>> A = {1, 2, 3, 4, 5, 6}
>>> B = {2, 3, 4, 5}
>>> A - B
{1, 6}
>>> A.difference(B)
{1, 6}

위처럼 - 연산자와 difference 함수를 사용하여 집합 B에 대한 A의 차집합을 얻을 수도 있습니다.


  대칭차집합을 구하는 함수 symmetric_difference

>>> A = {1, 2, 3, 4}
>>> B = {1, 4, 5}
>>> A ^ B
{2, 3, 5}
>>> A.symmetric_difference(B)
{2, 3, 5}

^ 연산자와 symmetric_difference 함수를 통하여 대칭차를 구할 수도 있습니다.


  부분집합, 상위집합인지 확인하는 함수 issubset, issuperset

A = {1, 3, 5}
>>> A.issubset({1, 3, 5, 7})
True
>>> A.issuperset({1, 3})
True

Issubset 함수를 통해서 부분집합인지 확인할 수 있으며, issuperset은 issubset의 반대로 상위집합인지 확인하는 함수입니다. 집합 A는 집합 {1, 3, 5, 7}의 부분집합이므로 참을, 그리고 집합 {1, 3}의 상위집합이므로 참을 내보냈습니다.

>>> A = {1, 3, 5}
>>> A >= {1, 3}
True
>>> A >= {1, 3, 7}
False

함수를 사용하는 방법 말고도, >=나 <= 연산자를 통하여 부분집합(subset)인지 확인할 수 있습니다. 진부분집합인지 확인하고 싶을 때는 어떻게 해야 할까요?

>>> A = {1, 2, 3, 4, 5}
>>> A > {1, 2, 4}
True
>>> A > {1, 5}
True
>>> A > {1, 2, 3, 4, 5}
False
>>> A > {1, 2, 6}
False

위 예제처럼 >나 < 연산자를 통하여 진부분집합(proper subset)인지 확인해볼 수 있습니다.


  집합에 원소를 추가하는 함수 add

>>> x = set(["Postcard", "Radio", "Telegram"])
>>> x.add("Telephone")
>>> print(x)
{'Telephone', 'Postcard', 'Telegram', 'Radio'}

위 예제처럼 add 함수를 통해서 집합에 원소를 추가할 수 있습니다.


  집합의 특정 원소를 제거하는 함수 remove

>>> x = set(["Postcard", "Radio", "Telegram"])
>>> x.remove("Radio")
>>> print(x)
{'Postcard', 'Telegram'}

위 예제처럼 remove 함수를 통해서 집합의 특정 원소를 제거할 수 있습니다.


  집합의 모든 원소를 제거하는 함수 clear

>>> x = set(["Postcard", "Radio", "Telegram"])
>>> x.clear()
>>> print(x)
set()

위 예제처럼 clear 함수를 통해서 집합의 모든 원소를 제거할 수 있습니다.