Python 자료형중 하나인 set (집합)에 대해 살펴보겠습니다.
1. 선언방법
set은 중괄호를 사용하거나, set() 함수를 사용해 생성합니다.
dictionary도 중괄호를 사용하지만 set은 key가 없고 value만 있습니다.
비어있는 set을 만들고싶다면 반드시 set()함수를 사용하여 생성해야 합니다.
( 비어있는 중괄호는 기본 dictionary로 생성되기 때문 )
>>> setA = {2, 3, 4}
>>> setA
{2, 3, 4}
>>> type(setA)
<class 'set'>
>>> setB = set([1, 5, 6])
>>> setB
{1, 5, 6}
>>> type(setB)
<class 'set'>
>>> setC = {}
>>> type(setC)
<class 'dict'>
>>> setD = set()
>>> type(setD)
<class 'set'>
2. set 자료형의 특징
2-1. 중복을 허용하지 않는다.
set 자료형의 원소는 중복될 수 없습니다.
원소로 2, 4, 6을 각각 2개씩 넣었지만 최종결과물에는 하나씩만 들어있습니다.
>>> {2, 4, 6, 2, 4, 6}
{2, 4, 6}
2-2. 순서가 없다.
set자료형은 순서가 없기때문에 index를 통해 값을 얻을 수 없습니다.
문자열을 set형태로 바꿔본결과 순서가 일정치 않음을 확인할 수 있습니다.
>>> set('baloon')
{'l', 'b', 'o', 'a', 'n'}
2-3. mutable한 값은 가질 수 없다.
set자료형은 여러 다양한 타입의 값을 함께 가질 수 있지만
list나 dictionary 처럼 mutable (변하는)한 객체는 가질 수 없습니다.
>>> setA = {'hello', 123, ('A','B')}
>>> setA
{'hello', 123, ('A','B')}
>>> setB = {123, 45, 'AA', [1, 2, 3]}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
3. 집합기능
set자료형의 가장유용한 기능은 바로 교집합, 합집합, 차집합등 집합기능 입니다.
3-1. 교집합
교집합은 말그대로 집합들중에 공통으로 포함된 원소로 이루어진 집합을 의미합니다.
& 연산자 또는 intersection() 함수로 사용합니다.
>>> setA = {'A', 'B', 'C', 'D'}
>>> setB = {'C', 'D', 'E', 'F'}
>>> setA & setB
{'C', 'D'}
>>> setA.intersection(setB)
{'C', 'D'}
두집합 중 공통으로 가지고있는 원소를 가진 집합이 리턴되었습니다.
3-2 합집합
합집합은 집합들의 원소를 모두합한 집합을 의미합니다.
물론 set자료형의 특징으로 중복은 제거됩니다.
| (파이프) 연산자 또는 union() 함수로 사용합니다.
>>> setA = {'Apple', 'Banana'}
>>> setB = {'Apple', 'Mango'}
>>> setC = {'Apple', 'Grape'}
>>> setA | setB | setC
{'Apple', 'Banana', 'Mango', 'Grape'}
>>> setA.union(setB)
{'Apple', 'Banana', 'Mango'}
>>> setA.union(setB).union(setC)
{'Apple', 'Banana', 'Mango', 'Grape'}
3-3 차집합
차집합은 A집합요소중 B집합요소와 같은것을 뺀 집합을 의미합니다.
- 연산자 또는 difference()함수로 사용합니다.
>>> setA = {1, 2, 3, 4}
>>> setB = {3, 4, 5, 6}
>>> setA - setB
{1, 2}
>>> setB.difference(setA)
{5, 6}
3-4 부분집합
부분집합은 A가 B에 온전히 다 포함되는집합인지를 의미합니다.
issubset()함수를 통해 부분집합 여부를 확인할 수 있습니다.
>>> setA = {1, 2, 3, 4}
>>> setB = {2, 3}
>>> setA.issubset(setB)
False
>>> setB.issubset(setA)
True
3-5 확대집합
확대집합은 A가 B의 확대집합 즉, B가 A에 온전히 포함되는 집합인지를 의미합니다.
issuperset()함수를 통해 확대집합 여부를 확인할 수 있습니다.
>>> setA = {1, 2, 3, 4}
>>> setB = {2, 3}
>>> setA.issuperset(setB)
True
>>> setB.issuperset(setA)
False
3-6 교집합 여부 확인
isdisjoint()함수를 통해 두 집합이 공통원소를 갖는지 즉 교집합이 있는지 확인합니다.
>>> setA = {1, 2}
>>> setB = {2, 3}
>>> setC = {3, 4}
>>> setA.isdisjoint(setB)
True
>>> setA.isdisjoint(setC)
False
4. set자료형 원소 추가
만들어진 set자료형에 값을 추가할때는 add() 함수와 update() 함수를 사용합니다.
add()함수는 1개의 요소를 추가할때 사용하고 update()함수는 여러개의 요소를 추가할때 사용합니다.
>>> setA = set()
>>> setA.add('hello')
>>> setA
{'hello'}
>>> setA.update('hello', 'bye', 'nice')
>>> setA
{'hello', 'bye', 'nice'}
5. set자료형 원소 삭제
특정원소를 제거하고 싶을 때는 remove함수를 사용합니다.
>>> setA = {1, 3, 5}
>>> setA
{1, 3, 5}
>>> setA.remove(3)
>>> setA
{1, 5}