본문 바로가기
프로그래밍 언어/Python 3

[Python] set 자료형 정리

by Physics 2021. 1. 1.
728x90

1. Python – Set/fronzenset 

set 자료형은 파이썬 2.3부터 지원을 시작한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다. 
 파이썬에서는 setfronzenset이란 두 가지 형태로 집합 자료형을 제공한다.
     - 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 

728x90

댓글