TIL

TIL(20.06.18) - Python 기본(Python 자료형 - SET)

sincerely10 2020. 6. 18. 16:09
반응형

바로이어서 작성하고자 합니다.
지난번과 같이 Python 내부 자료구조에 대한 학습입니다.

오늘은 집합형태의 자료구조인 Set에 대해서 학습하였습니다.

1. 개요

set의 가장 큰 특징은 다음과 같습니다.

a. 중복을 허용하지 않는다.

b. 내부에 있는 원소들은 순서가 없다.

(생각이 잘 안 나기도 하지만) 한 마디로 수학시간에 배우던 집합과 동일한 개념입니다.
후술 되는 집합에서 사용하는 Method도 있습니다.

2. 선언과 타입

아래와 같은 형태로 선언하고 type을 확인합니다.

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

# 생성되지 않는 형태
>>> myset2 = {7,8,9}
>>> myset + myset2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'
>>> myset | myset2
{1, 2, 3, 4, 5, 7, 8, 9}
>>> {1,2,3}*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

조금 전의 특징이 한꺼번에 드러나는 선언입니다.
값이 중복되고 마음대로인 순서로 선언하였지만, 저장될 때는 특징이 다 적용됩니다.

또한, range로 생성이 가능하지만 *를 통한 구간 중복 생성이나 + 로 합쳐지지 않습니다.

3. Method

Method는 다음과 같습니다.

>>> dir(set)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',\
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__'\
, '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', \
'__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', \
'__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', \
'__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', \
'copy', 'difference', 'difference_update', 'discard', 'intersection', \
'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', \
'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

List 보다 더 다양한 것 같습니다.

3.1 add

+ 로 추가 할 순 없지만, add로 원소 하나를 추가할 수 있습니다.(물론 중복은 제거되고)

>>> myset
{1, 2, 3, 4, 5}
>>> myset.add(100)
>>> myset
{1, 2, 3, 4, 5, 100}

3.2 집합을 이용한 다양한 Method

집합을 배웠을 때, 합집합, 교집합, 차집합이 있었습니다.
이러한 기능을 set에서 method 만으로 구현이 가능합니다.

>>> myset
{1, 2, 3, 4, 5, 100}
>>> myset2 = {4,5,9}

# Union(합집합)
>>> myset.union(myset2)
{1, 2, 3, 4, 5, 100, 9}
>>> myset | myset2
{1, 2, 3, 4, 5, 100, 9}

# intersection(교집합)
>>> myset.intersection(myset2)
{4, 5}
>>> myset & myset2
{4, 5}

# difference(차집합)
>>> myset.difference(myset2)
{1, 2, 3, 100}
>>> myset - myset2
{1, 2, 3, 100}

# symmetric difference(대칭집합)
>>> myset.symmetric_difference(myset2)
{1, 2, 3, 100, 9}

# 부분집합 확인
>>> myset3 = {1, 2, 3}
>>> myset3.issubset(myset)
True

적다 보니 굉장히 다양해졌는데, 일부 기능의 경우 기호( |, &, -)로 구현이 가능합니다.

4. 응용하기

set의 경우 중복과 순서를 고려하지 않기 때문에, list의 종류를 파악하는 등에 유용하게 쓰일 수 있습니다.

>>> list = [5,3,5,3,5,6,9,235]
>>> set(list)
{3, 5, 6, 9, 235}
>>> len(set(list))
5

위 코드와 같이 list에 중복된 원소가 있습니다.
이를 set 형태로 형변환하면, 5개의 원소만 남습니다.
그리고 이 사이즈만 추출하면 5라는 값이 출력됩니다.

하루에 공항에서 어떤 국가로 출국하는 데이터를 모두 받아오고, 몇 개의 나라로 출국했는지를 알고 싶다면 위의 형태로 간단한 method를 통해 파악이 가능할 것입니다.

반응형