코딩 연습

(파이썬) 집합 본문

Python

(파이썬) 집합

코딩아저씨 2016. 3. 15. 18:37
반응형

파이썬에서 집합을 표현하기 위해서는 다음과 같이  sympy 패키지의 FiniteSet 클래스를 이용하면 된다. 

>>> from sympy import FiniteSet
>>> A = FiniteSet(1, 2, 3, 4, 5)
>>> A
{1, 2, 3, 4, 5}

공집합을 정의하고 싶거나 일반적인 리스트를 집합으로 표현하고 싶다면 다음과 같이 하면 된다.

>>> B=FiniteSet()
>>> B
EmptySet()
>>> elements = ['a', 'b', 'c']
>>> C = FiniteSet(*elements)
>>> C
{a, b, c}

집합의 원소의 개수를 알고 싶다면 우리에게 친숙한 len() 함수를 사용하면 된다.

>>> len(A)
5

원소와 집합의 포함관계 즉, \(1 \in A\) 혹은 \(6 \notin A\) 와 같은 관계를 알고 싶다면 in 연산자를 쓰면 된다.

>>> 1 in A
True
>>> 6 in A
False

집합은 원소들의 순서가 중요하지 않으므로 다음과 같은 결과를 얻을 수 있다.

>>> D = FiniteSet(3, 4, 1, 5, 2)
>>> A == D
True

집합과 집합사이의 포함관계를 나타낼 때는 is_subset(), is_superset() 매서드를 이용한다. 

>>> E = FiniteSet(1, 2, 3)
>>> E.is_subset(A)
True
>>> A.is_superset(E)
True
>>> E.is_superset(A)
False
>>> A.is_subset(E)
False

또한 어떤 집합의 부분집합들로 이루어진 집합인 멱집합을 나타낼 때는 powerset() 매서드를 사용하면 된다.

>>> E.powerset()
{EmptySet(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}

원소의 개수가 \(n\) 개인 집합의 부분집합의 개수는 \(2^n\) 개인 것을 잘 알고 있을 것이다. (중고등학교를 무사히 졸업했다면....) 현재 \(E=\{1, \;2, \;3\}\)  이므로 \(E\) 집합의 부분집합의 개수를 \(2^3 = 8\) 개가 되는 것이다. (물론 공집합 포함)

부분집합에는 공집합도 포함되지만 자기 자신도 포함된다는 것을 배웠을 것이다. 집합 \(E\)의 부분집합에 \(\{1, \;2, \;3\}\) 이 포함되는 것처럼... 그래서 우리는 자기 자신을 제외한 부분집합을 진부분집합 (진짜 부분집합이라고 배웠던 기억이 가물가물) 이라고 표현하는데, 진부분집합인지 아닌지 확인할 때는 is_proper_subset() 매서드를 사용하면 된다. 마찬가지로 is_proper_supersuet() 매서드도 가능하다. (현재 \(A=\{1, \;2, \;3, \;4,\;5\}\), \(C=\{1, \;2, \;3,\;4,\;5\}\), \(E=\{1, \;2,\;3\}\) 이다.)

>>> E.is_proper_subset(A)
True
>>> C.is_proper_subset(A)
False
>>> C.is_proper_superset(A)
False
>>> A.is_proper_superset(E)
True

합집합과 교집합은 union() 매서드와 intersect() 매서드를 이용하여 나타낼 수 있다. 

>>> F = FiniteSet(3, 4, 5, 6, 7)
>>> A.intersect(F)
{3, 4, 5}
>>> A.union(F)
{1, 2, 3, 4, 5, 6, 7}

세 개 이상의 집합에서 교집합 합집합을 구하려면 다음과 같이 union(), intersetc() 매서드를 연속적으로 사용하면 된다.

>>> A.union(E).union(F)
{1, 2, 3, 4, 5, 6, 7}
>>> A.intersect(E).intersect(F)
{3}

차집합의 경우는 간단히 '-' 연산자를 사용하여 표현이 가능하다.

>>> A - F
{1, 2}

마지막으로 데카르트 곱(cartesian product) 은 간단히 '*' 연산자로 구해낼 수 있다.

>>> G = FiniteSet(4, 5, 6)
>>> E * G
{1, 2, 3} x {4, 5, 6}
>>> for i in E * G:
...     print(i)
...
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)

파이썬에서 집합을 표현하는 방법과 집합의 연산에 대해서 간단히 살펴보았다. 사실 파이썬에서는 리스트(list), 튜플(tuple)과 더불어 집합(set)을 기본 데이터 형으로 제공하고 있다. 다음의 예제를 본다면 좀 더 쉽게 집합에 접근할 수 있다.

>>> A=[1, 2, 2, 3, 3, 4, 5]
>>> a=[1, 2, 3, 4, 4, 5, 5]
>>> b=[3, 4, 5, 6, 7]
>>> A=set(a)    # 리스트 a 로부터 집합 A 정의
>>> B=set(b)    # 리스트 b 로부터 집합 B 정의
>>> A
{1, 2, 3, 4, 5}    # 집합이기 때문에 같은 원소가 여러 개 있어도 하나로 취급
>>> B
{3, 4, 5, 6, 7}    # 집합이기 때문에 같은 원소가 여러 개 있어도 하나로 취급
>>> A | B    # 집합 A와 집합 B의 합집합
{1, 2, 3, 4, 5, 6, 7}
>>> A & B    # 집합 A 와 집합 B의 교집합
{3, 4, 5}
>>> A - B    # 집합 A와 집합 B의 차집합
{1, 2}
>>> A ^ B    # 집합 A와 집합 B의 대칭 차집합
{1, 2, 6, 7}


반응형

'Python' 카테고리의 다른 글

(파이썬) 미분계수 구하기  (4) 2016.03.15
(파이썬) 극한값 구하기  (0) 2016.03.15
(파이썬) 방정식 풀기  (0) 2016.03.15
(파이썬) 다항식의 전개와 인수분해  (0) 2016.03.15
(파이썬) 최빈값 구하기  (0) 2016.03.15


Comments