1. Python – Set/fronzenset
• set 자료형은 파이썬 2.3부터 지원을 시작한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.
• 파이썬에서는 set
과 fronzenset
이란 두 가지 형태로 집합 자료형을 제공한다.
- set
: 변경이 가능한 집합
- fronzenset
: 변경이 불가능한 집합
※ fronzenset
은 변경이 불가능한 집합이기 때문에, 요소를 추가하거나 삭제하는 연산 및 Method를 사용할 수 없다.
• Set 자료형을 사용하는 이유: 집합 내의 요소들의 교집합, 합집합, 차집합을 구할 때, 유용하게 사용될 수 있음
2. Set의 특징
• 순서가 없음
- 집합에서는 순서가 없기 때문에, 어떤 값이 먼저 나올지 알 수 없음
- Set에서는 순서가 없기 때문에, 순서와 관련된 인덱스 기호 "[]"를 사용할 수 없다.
- 따라서, set 자료형에 저장된 값을 인덱스로 접근하기 위해선, 리스트나 튜플의 형태로 변환 후 사용해야 한다.
• Set 내부의 원소들은 집합 안에서 유일함 (즉, 중복되는 데이터가 없음)
- 집합 내부에 중복된 값이 없다는 특징때문에, 중복된 값들을 필터링하는데 종종 쓰인다.
• Mutable한 객체
※ Set 내부에 중복된 데이터가 없음
>>> example_set = {'a','b','b','c','d', 1,2,3,4,4,5,5,5,6,6,6,6}
>>> example_set
{1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd'}
※ Set에는 순서가 없음
>>> print(example_set1)
{1, 'b', 2, 3, 4, 5, 6, 'a', 'c'}
3. Set 자료형을 만드는 방법
1) set 자료형을 만들 때는 아래의 두 가지 방법을 사용해서 만들 수 있다.
• “{}” 중괄호를 이용함
• set 생성자를 사용함
# the 1st way
>>> example_set1 = set(["a","b","c"])
>>> print(example_set1)
{'b', 'a', 'c'}
>>> print(type(example_set1))
<class 'set'>
# the 2nd way
>>> example_set2 = {"a","b","c"}
>>> print(example_set2)
{'b', 'a', 'c'}
>>> print(type(example_set2))
<class 'set'>
2) 반복 가능한 (iterable) 객체*로부터 set 자료형을 생성할 수 있다.
* 반복 가능한 객체: 튜플, 문자열, 리스트, dictionary
※단, dictionary로 된 자료를 set 자료형으로 만들 경우, 키값으로 집합이 만들어짐
# 1. creating set from the list
>>> set_by_list = set(["a","b","c"])
>>> print(set_by_list)
{'b', 'a', 'c'}
# 2. creating set from the tuple
>>> set_by_tuple = set(("a","b","c"))
>>> print(set_by_tuple)
{'b', 'a', 'c'}
# 3. creating set from the dictionary
>>> set_by_dict = set({"apple":1, "banana":2, "melon":3})
>>> print(set_by_dict)
{'banana', 'apple', 'melon'}
# 4. creating set from the string
>>> set_by_string = set("hello")
>>> print(set_by_string)
{'o', 'h', 'e', 'l'}
3) 집합의 원소가 되기 위해선 아래 두 가지를 만족해야 한다.
• 해쉬 기능 (Hashable)*
• 변경 불가능한 자료형: 정수(integer), 실수(float), 튜플 (tuple), 문자열 (strings)
* Hashable: 해쉬 테이블의 주소값을 해쉬함수를 통해 접근 가능
※ set 자체는 변경가능한 자료형이지만, set의 원소로 들어가는 값은 변경 불가능한 자료형이어야 한다.
따라서, list, set, dictionary와 같이 변경 가능한 자료형은 set의 원소로 사용할 수 없다.
>>> wrong_set = {[["a","b","c"],"d"]}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-193-668627db774c> in <module>
----> 1 wrong_set = {[["a","b","c"],"d"]}
TypeError: unhashable type: 'list'
4. Set과 관련된 명령어
1) in
, not in
, len()
명령어
• 집합의 길이 구하기: len(<set>)
• 집합 내부에 원소가 있는지 확인: <value> in <set>
• 집합 내부에 원소가 없는지 확인: <value> not in <set>
2) Set에 원소를 추가하는 방법:
• 하나의 원소만 추가를 할 경우: <set>.add(<value>)
• 여러 개의 원소를 한 번에 추가할 경우: <set>.update(<list>)
- 주어진 객체(list, set, ...)등에 대한 합집합 연산을 한다.
• add()를 사용하는 경우의 예시
>>> example_set.add('e')
>>> example_set
{1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 'e'}
# 만일 add를 이용하여 여러 개의 원소를 추가하는 경우에는 아래와 같이 에러 메시지가 나온다
>>> example_set.add('e','f')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-772-276f199dc446> in <module>
----> 1 example_set.add('e','f')
TypeError: add() takes exactly one argument (2 given)
• update()를 사용하는 경우의 예시
>>> example_set = {'a','b'}
>>> example_set.update(['c', 'd'])
>>> example_set
{'a','b','c','d'}
3) Set에 원소를 제거하는 방법:
• <set>.remove(<element>)
• <set>.discard(<element>)
• <set>.pop()
: 임의의 원소를 하나 가져온 후 삭제함
• <set>.clear()
: 모든 원소를 지우고 공집합으로 만듬
4) 교집합, 합집합, 차집합, 대칭 차집합
• 교집합: <set1> & <set2>
또는 <set1>.intersection(<set2>)
• 합집합: <set1> | <set2>
또는 <set1>.union(<set2>)
• 차집합: <set1> - <set2>
또는 <set1>.difference(<set2>)
• 대칭차집합: <set1>^<set2>
또는 <set1>.symmetric_difference(<set2>)
※ 위에서 언급한 함수들은 값만 리턴하는 반면, update가 붙은 함수는 원본데이터를 변경한다.
ex) <set1>.intersection(<set2>)
는 <set1>과 <set2>의 교집합을 리턴하지만, <set1>.intersection_update(<set2>)
는 두 집합의 교집합을 <set1> 데이터로 업데이트한다.
5) is로 시작하는 함수
• isdisjoint() - 두 집합이 공통 원소를 갖지 않는가?
• issubset() - 부분집합(subset)인가?
• issuperset() - 확대집합(superset)인가?
Reference:
[1] www.codingfactory.net/10043
[2] withcoding.com/77
[3] snakify.org/ko/lessons/sets/
[4] wikidocs.net/1015
[5] wikidocs.net/16044
'프로그래밍 언어 > Python 3' 카테고리의 다른 글
[Python3] Matplotlib - contour plot (1) | 2021.05.04 |
---|---|
[Python] 리스트 내에 element가 있는지 확인 (0) | 2021.03.22 |
[Python] 리스트 중복 제거 (순서 유지 X, 순서 유지 O) (0) | 2020.12.29 |
[Python 3] dictionary list sorting (0) | 2020.12.20 |
[Python] Dictionary sorting by key or value (0) | 2020.12.19 |
댓글