IT

[파이썬 기초] 자료구조(4) - 셋(set)

생각파워 2018. 12. 10. 17:25

 

셋은 중복되지 않은 값을 순서없이 보관하는 자료구조이다.

항목이 중복되지 않고(유일하고), 순서가 없는 특성으로 볼때 딕셔너리의 키와 같다.

순서가 없고, 키가 존재하지도 않기때문에 어떤 특정한 값에 접근할 수가 없다.

단지 어떤항목이 존재하는지 않는지에 대한것을 파악하고자 할때 사용된다.

 

1. 셋 생성

셋을 생성할 때는 중괄호를 사용하거나 set()함수를 사용한다.

중괄호를 사용할 때는 중괄호 사이에 콤마로 구분된 값을 넣어주면 된다.

중복된 값을 입력하면 중복된 값은 삭제된다.

 >>> a_set = {1,3,5,7,9}
>>> a_set
{1, 3, 5, 7, 9}
>>> b_set = {1,1,1,2,2,3}                  # 1을 3개, 2를 두개 입력했지만, 하나식만 저장된다.
>>> b_set
{1, 2, 3}

 

2. 셋 변환

set() 함수는 다른 자료구조를 셋으로 변환할 때 사용한다.

중괄호 생성시와 마찬가지로 셋 생성 시 중복된 값을 입력하면, 중복된 값은 삭제된다.

 >>> tlist = ['a','b','c']
>>> c_set = set(tlist)
>>> c_set
{'b', 'a', 'c'}


>>> tlist2 = ['a','a','b','b','c']
>>> d_set = set(tlist2)                   # 리스트에서 중복되었던 'a','b'값이 하나씩만 남음.
>>> d_set
{'b', 'a', 'c'}                           # 출력순서가 없음

 

3. in으로 존재여부 파악

다른 자료구조들과 동일하게, 셋도 in명령어를 이용해서 존재여부를 파악할 수 있다.

존재하면 True, 존재하지 않으면 False를 리턴한다.

>>> d_set
{'b', 'a', 'c'}
>>> 'a' in d_set
True
>>> 'f' in d_set
False 

 

4. 집합연산 : 교집합, 합집합, 차집합

셋이 집합이기 때문에 집합연산이 가능하다.

다 알고 있겠지만 다시한번 옛날을 상기해보자.

 

교집합은 두 집합 사이에 공통으로 존재하는 값들을 찾는다.

연산자로는  엠퍼센드('&')를 사용하며, intersection() 메서드를 사용한다.

 

합집합은 두 집합 존재하는 모든 값들을 찾는다.

연산자로는 버티컬바('|') 를 사용하며, union() 메서드를 사용한다.

 

차집합은 a 집합에 존재하는 값 중 b에 존재하는 값을 삭제시킨 집합을 말한다.

연산자는 대쉬('-')를 사용하며, difference() 메서드를 사용한다.

 

>>> a_set & b_set                         # 교집합
{1, 3}
>>> a_set.intersection(b_set)
{1, 3}


 >>> a_set | b_set                         # 합집합
{1, 2, 3, 5, 7, 9}
>>> a_set.union(b_set)
{1, 2, 3, 5, 7, 9}


>>> a_set - b_set                         # 차집합
{9, 5, 7}
>>> a_set.difference(b_set)
{9, 5, 7}

 

 

5. 서브셋, 프로퍼 서브셋

b셋이 a셋의 서브셋이라고 했을때, b셋은 a셋이 가진 모든 항목을 가진다. 두 셋이 똑같을 때를 포함한다.

b셋이 a셋의 프로퍼 서브셋이라고 했을 때, b셋은 a셋보다 하나의 항목을 작게가져야 한다.

예를 들어보면,

 

a = {1,3,5} 이고, b = {1,5}, c={1,3,5} 일 경우

a에 대해 b와 c는 a의 서브셋이 된다. 같은 경우에도 서브셋이 된다고 했으니...

 

그리고 b는 a보다 항목을 하나 작게 가져서 프로퍼 서브셋이 되지만,

c는 a와 같기 때문에 프로퍼 서브셋이 되지 못한다.

같으면 프로퍼 서브셋이 되지 못한다 

수식으로 표현해보면

 

서브셋은(작거나 같다)

b <= a 

c <= a

이고

프로퍼 서브셋은(작다)

b < a

가 된다.

c는 같기때문에 프로퍼 서브셋은 되지 못한다.

 

파이썬에서 위의 수식을 가지고 서브셋, 프로퍼 서브셋 여부를 알 수 있다.

>>> a = {1,3,5}
>>> b = {1,5}
>>> c = {1,3,5}
>>> c <= a                       # c는 a의 서브셋. 같은 항목을 가지고 있어도 서브셋. 
True
>>> b <= a                      # b는 a의 서브셋
True
>>> c < a                         # c는 a와 같은 항목을 가지고 있기때문에 프로퍼 서브셋이 안됨
False
>>> b < a                         # b는 a보다 하나 이상 작게 가지고 있기때문에 프로퍼 서브셋!!
True
>>> c.issubset(a)                 # issubset() 메서드로도 사용가능
True
>>> b.issubset(a)
True
>>> b.issubset(b)                 # 자기자신은 자신의 서브셋
True

 

 

 

6. 슈퍼셋, 프로퍼 슈퍼셋

b 셋이 a셋의 슈퍼셋이라고 했을 때, b셋의 항목은 a셋의 항목보다 같거나 커야한다.

수식으로는 b >= a 가 된다.

그래서 셋은 자기자신의 슈퍼셋이 될 수 있다.

 

b셋이 a셋의 프로퍼 슈퍼셋이 되려면 b셋의 항목이 하나 이상 많아야한다.

수식으로는 b > a 가 된다.

그래서 셋은 자기자신의 프로퍼 슈퍼셋이 될 수 없다.

 

슈퍼셋인지 확인하는 방법은 '>=' 연산자를 사용하거나 issuperset()메서드를 사용한다.

프로퍼 슈퍼셋인지 확인하는 방법은 '>'연산자를 사용한다.

>>> a = {1,2}
>>> b = {1,2,3}
>>> c = {1,2}
>>> b >= a                   # b셋은 a셋의 슈퍼셋
True
>>> b.issuperset(a)          # b셋은 a셋의 슈퍼셋       
True
>>> b.issuperset(c)          # b셋은 a셋의 슈퍼셋. a셋과 c셋의 값이 같음.
True
>>> a >= c                   # a셋과 c셋의 값이 같기 때문에 a셋은 c셋의 슈퍼셋이 될 수 있음
True
>>> b > a                    # b셋이 a셋보다 하나이상의 항목을 더 가지고 있기때문에 b셋은 프로퍼 슈퍼셋임
True
>>> c > a                    a셋과 c셋의 값이 같기 때문에 c셋은 a셋의 프로퍼 슈퍼셋이 될 수 없음
False 

 

 

 

 

반응형