이번 포스팅에서는 집합(set) 자료형에 대해 포스팅한다.
set 자료형은 집합 관련된 것을 처리하는 데에 매우 유용한 자료형이다.
set를 만드는 방법과, 특징, 집합에 관련한 연산과 관련 함수들에 대해 알아본다.
집합(set) 만들기
x = set() 형태로 set 자료형 만들기
>>> a = set([1, 2, 3]) # 변수=set([리스트]) 형태로 set 만들기
>>> a
{1, 2, 3}
>>> a = set(('Hello', 'Python')) # 변수=set((튜플)) 형태로 set 만들기
>>> a
{'Hello', 'Python'}
>>> a = set("Hello") # 변수=set('문자열') 형태로 set 만들기
>>> a
{'l', 'H', 'e', 'o'}
>>> type(a)
<class 'set'>
set 자료형은 위와 같이 set 키워드에 괄호()로 둘러싸서 만들 수 있다. 괄호 안에는 리스트, 튜플, 문자열 등이 들어올 수 있으며 모든 요소가 개별로 분리되어 set 자료형으로 변환된다.
다만 문자열 'Hello'가 입력되면 순서도 뒤죽박죽이고 문자 'o'가 하나 사라진 것을 볼 수 있다.
이는 곧 다룰 set 자료형의 특징에서 다뤄보도록 하고 지금은 이 결과만 눈으로 확인하고 넘어가자.
x = { } 형태로 set 자료형 만들기
>>> a = {1, 2, 3, 4, 5} # 중괄호{}로 set 생성
>>> a
{1, 2, 3, 4, 5}
>>> a = {1, 2, 3, 'a', 'b'} # 혼합된 자료형을 가진 set 생성
>>> a
{1, 2, 3, 'b', 'a'}
>>> a = {1, 2, 'a', 'b', ('c', 'd')} # 튜플을 포함한 set 생성
>>> a
{1, 2, ('c', 'd'), 'b', 'a'}
>>> a = {1, 2, 'a', 'b', ['c', 'd']} # 리스트를 포함한 set 생성
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
x = set() 형태가 아닌 x = {} 형태로 set를 만들 수도 있다. 중괄호{}는 딕셔너리에서도 사용했는데, key:value 형태로 입력하면 딕셔너리가 되고, 요소값만 입력하면 set가 된다.
위 예문을 보면 세트의 요소로 숫자, 문자, 튜플을 포함하고 혼용하여 사용할 수도 있지만, 리스트는 사용할 수 없다.
그 이유는 집합(set) 자료형은 요소값으로 변경불가능한 객체만 사용할 수 있기 때문인데, 잠깐 변경가능(mutable)한 객체와 변경불가능(immutable)한 객체에 대해 알아보도록 하자.
변경가능한 객체와 변경 불가능한 객체
1. 변경가능(mutable)한 객체: 리스트(list), 딕셔너리(dict), 집합(set)
- 변경 가능한 객체란 내부의 값이 바뀌면 변수의 주소값이 바뀌는 자료형들이다.
2. 변경불가능(immutable)한 객체: 자료형(int, str), 튜플(tuple)
- 변경불가능한 객체란 값이 바뀌면 주소가 바뀌는 자료형이나, 값을 바꿀 수 없는 튜플 같은 자료형이다.
코드를 통해 살펴보자.
>>> a = [1, 2, 3]
>>> id(a) # 리스트 변경 전 주소 확인
1505817554888
>>> a[0] = 4 # 리스트 요소값 변경
>>> a
[4, 2, 3]
>>> id(a) # 리스트 변경 후 주소 확인
1505817554888
리스트 a는 [1, 2, 3]의 값을 가지고 있는데 리스트 a의 첫 번째 요소값을 변경했다. 리스트 a의 요소값이 변경되기 전과 후의 주소값을 비교하니 동일하다. 딕셔너리와 집합도 요소값의 변화로 인해 주소값이 바뀌지 않는다.
이런 자료형을 mutable 하다고 하는데 집합(set) 자료형은 변경가능한 자료형을 요소값으로 삼을 수 없다.
>>> a = 3
>>> id(a) # a의 값 변경 전 주소 확인
140718765341824
>>> a = 4
>>> id(a) # a의 값 변경 후 주소 확인
140718765341856
>>> a = (1, 2, 3)
>>> a[0] = 4 # 튜플의 요소값은 수정 불가능
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
변수 a에 정수 3이 입력되어 있다. 이 값을 바꾸기 위해서는 리스트처럼 인덱싱을 하여 개별 요소값을 바꾸는 것이 아니라 a에 새로운 수를 입력해야 하는데, 이때 a의 주소값이 변경된다.
튜플의 경우에는 요소값을 변경하거나 삭제할 수가 없다. 이런 경우 immutable 하다고 표현한다.
빈 집합(set) 만들기
>>> a = set() # 빈 집합 생성
>>> a
set()
>>> type(a) # 자료형 확인
<class 'set'>
>>> a = {} # 중괄호{}로 빈 집합 생성 시도
>>> a # 딕셔너리 생성
{}
>>> type(a) # 딕셔너리 자료형 확인
<class 'dict'>
빈 집합을 만들 때는 x = set() 형태로 괄호 안을 비워두면 되는데, 빈 집합을 만들 때는 주의가 필요하다.
x = {} 형태로 집합을 만들 수 있기 때문에 빈 중괄호로 집합을 만드려 할 수도 있다. 하지만 빈 중괄호{}로 집합을 만들면 빈 집합이 아닌 빈 딕셔너리가 생성된다. 헷갈릴 수 있으니 주의하며 사용하자.
집합 자료형의 특징
중복 불가능한 집합의 요소값
>>> a = set('Hello') # 집합 a 생성
>>> a
{'l', 'H', 'e', 'o'}
집합은 딕셔너리와 유사한 성격을 가진다. 딕셔너리가 중복된 key를 가질 수 없듯이 집합의 요소값은 중복해서 존재할 수 없는다. 그 이유로 set('Hello')를 출력하면 두 개의 'l' 중 하나만 집합에 포함되게 된다.
이러한 특성을 사용하면 집합을 꽤나 유익하게 사용할 수 있다.
>>> a = [1, 2, 3, 1, 3, 3, 4, 5, 4, 1, 2, 3] # 중복된 값을 지니는 리스트
>>> set(a) # set로 변환하여 중복값 제거
{1, 2, 3, 4, 5}
>>> list(set(a)) # 다시 list로 변환
[1, 2, 3, 4, 5]
위 코드를 보자. 리스트에서 중복되는 값을 제거하고 싶을 때 리스트를 집합으로 변환하면 중복값이 모두 제거된다.
변환된 집합을 다시 리스트로 변환하면 리스트의 중복값을 손쉽게 제거할 수 있다.
순서가 없는 집합의 요소값
>>> a = set('Hello')
>>> a # 순서가 없는 요소값
{'l', 'H', 'e', 'o'}
딕셔너리와 집합의 닮은 점이 또 있는데 바로 순서가 없다는 것이다. 집합은 순서가 없기 때문에 위처럼 뒤죽박죽으로 요소값이 나열된다.
마찬가지로 딕셔너리에는 순서가 없어 인덱싱을 지원하지 않듯이 집합 역시 인덱싱으로 요소값에 접근할 수 없다.
집합의 요소값에 접근하기
>>> a = {'l', 'H', 'e', 'o'}
>>> a[0] # 집합은 인덱싱으로 요소값에 접근 불가
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object is not subscriptable
>>> b = list(a) # 튜플이나 리스트로 변환 후 인덱싱 사용
>>> b[0]
'l'
집합은 순서가 없는 자료형이기 때문에 인덱싱으로 값에 접근할 시 에러가 발생한다. 집합의 요소값에 접근을 하기 위해선 집합을 튜플이나 리스트로 변환 후 인덱싱으로 접근할 수 있다.
2022.10.02 - [파이썬/기초 문법] - [Python]딕셔너리(dictionary) 만들기, 요소값 추가&수정&삭제, key로 value 얻기
'파이썬 > 기초 문법' 카테고리의 다른 글
[파이썬]불 자료형 - bool 함수로 참과 거짓 판별하기 (1) | 2022.10.04 |
---|---|
[파이썬]set 자료형 다루기 - 집합의 연산 및 관련 함수 (0) | 2022.10.04 |
[파이썬]딕셔너리 함수들 - keys, values, items, clear, get, in (0) | 2022.10.03 |
[파이썬]딕셔너리 기본 - 만들기, 키와 값, 키로 값 얻기 (0) | 2022.10.02 |
[파이썬]튜플 이해하기 - 특성, 인덱싱, 슬라이싱, 연산 (0) | 2022.10.02 |
댓글