파이썬 강좌 4-7편. 집합(Set)
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}
>>> 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 함수를 통해서 집합의 모든 원소를 제거할 수 있습니다.
'프로그래밍 관련 > Python' 카테고리의 다른 글
파이썬 강좌 번외편. 클로저(Closure) (2) | 2019.11.21 |
---|---|
파이썬 강좌 번외편. 재귀 함수 (0) | 2019.03.29 |
파이썬 강좌 11편. 예외 처리(Exception Handling) (23) | 2013.12.29 |
파이썬 강좌 10-2편. 파일 입출력(File I/O) (39) | 2013.12.15 |
파이썬 강좌 10-1편. 입출력(I/O) (10) | 2013.12.13 |