Py) 기초 - 객체(세트)

Py) 기초 - 객체(세트)

파이썬 기반 데이터분석을 위하여 파이썬 기본 객체중 하나인 세트(set)에 대해 알아본다.


개요

세트(set)는 중괄호를 사용하여 생성한다. 생성 방법은 리스트에서 대괄호 대신 중괄호를 쓰는 것만 달라보이는데 기능은 많이 다르다. 세트 객체는 집합 객체이기 때문에 합집합, 차집합 등 각종 집합 연산을 지원한다. 그리고 집합의 성질을 그대로 가져와 중복 원소를 허용하지 않는 특징이 있다.
※ 파이썬 버전 2.3 부터 지원한다.

  • 생성
    리스트와 유사하나 중괄호를 사용하여 생성하며 원소의 구분은 쉼표로 함. 다른 객체와 달리 중첩을 허용하지 않기 때문에 원소에 리스트나 집합 같은 객체가 올 수 없다. 생성시 중복된 원소가 있다면 자동으로 중복 제거가 된다.
  • 색인
    세트의 중요한 특징이 중복/중첩 원소를 허용하지 않는 것도 있지만 순서가 없다(unordered)는 특징도 있어 다른 객체처럼 대괄호를 사용한 객체 내부 원소의 인덱싱(색인)이 불가하다.
  • 조작
    합집합, 차집합 등 각종 집합 연산을 연산자와 메서드를 사용하여 수행이 가능하다.

실습

생성 및 인덱싱

다음과 같이 중괄호를 사용하여 세트 객체를 생성할 수 있으며 튜플처럼 객체의 원소가 하나라고 해서 별도의 조치를 취해야 하는 불편함은 없다. 물론 원소의 구분은 쉼표로 한다. 그리고 중복된 원소는 제거되는 것 또한 확인할 수 있다.

1
2
3
4
5
6
7
8
{999}
## {999}

{100, 200, 300}
## {100, 200, 300}

{100, 200, 300, 300}
## {100, 200, 300}

다음의 코드와 같이 원소에 리스트가 있다면 다음과 같은 에러를 일으키며 객체 생성이 되지 않는다.

1
2
3
4
5
6
7
{1, [2, 3]}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_24112\3161137572.py in <module>
----> 1 {1, [2, 3]}

TypeError: unhashable type: 'list'

다음과 같이 세트 객체를 생성하더라도 대괄호를 사용한 색인을 시도하면 에러가 발생하는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
set_sample = {1, 2, 3}
set_sample[0]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_24112\2195873579.py in <module>
1 set_sample = {1, 2, 3}
----> 2 set_sample[0]

TypeError: 'set' object is not subscriptable

치환 및 조작

다음과 같이 두 세트 객체를 생성해보자.

1
2
set_1 = {111, 222, 333}
set_2 = {111, 2, 3}

사실 인덱싱이 되지 않기 때문에 대괄호를 사용하여 원소 치환을 시도하면 다음과 같이 에러가 발생한다.

1
2
3
4
5
6
7
set_1[0] = 999
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_24112\1146700394.py in <module>
----> 1 set_1[0] = 999

TypeError: 'set' object does not support item assignment

다음의 코드로 세트 객체의 메서드를 확인할 수 있고 여기서 원소 치환과 관련된 메서드는 없다는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[m for m in dir(set_1) if m[0] != "_"]
## ['add',
## 'clear',
## 'copy',
## 'difference',
## 'difference_update',
## 'discard',
## 'intersection',
## 'intersection_update',
## 'isdisjoint',
## 'issubset',
## 'issuperset',
## 'pop',
## 'remove',
## 'symmetric_difference',
## 'symmetric_difference_update',
## 'union',
## 'update']

합집합, 차집합, 교집합의 계산은 다음과 같다.

1
2
3
4
5
6
7
8
set_1.union(set_2)
## {2, 3, 111, 222, 333}

set_1 - set_2
## {222, 333}

set_1 & set_2
## {111}

집합의 포함관계를 확인할 수 있는 메서드도 지원한다.

1
2
3
4
5
set_1.issubset({111, 222, 333, 555})
## True

set_1.issuperset({111, 222})
## True

.issubset() 메서드는 기준 세트 객체가 메서드에 입력된 세트 객체의 부분집합(subset)인지 검사하는 메서드이고 .issuperset() 메서드는 기준 세트 객체가 메서드에 입력된 세트 객체의 상위집합(superset)인지 검사하는 메서드이다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×