상세 컨텐츠

본문 제목

set, set comprehension, frozen set

개발/python-심화(Advanced)

by Matthew0633 2022. 4. 27. 23:17

본문

set 은 사실 집합연산에 활용할 수 있는 메소드들에 대해 잘 아는게 중요하다고 생각되지만, 지금은 개념과 comprehension, frozen set 사용법 정도 정리하고자 한다

 

Set

Mutable하지만 원소의 중복을 허락하지 않는 set은 원소를 집합으로 다루며, 집합연산이 가능한 자료구조이다

 

Set 생성

  • set 를 생성은 기본적으로 set([원소1, 원소2,...]){원소1, 원소2,...} 와 같은 두가지 방식이 가능하다
  • 빈 set를 생성할 때는 {} 로 정의할 경우 Dict가 생성되기 때문에, set() 로 생성해야한다
  • set 을 immutable 하게 사용하고자 할 때는 파이썬 내에 구현되어 있는 frozenset을 활용한다
  • mutable 한 기본 set에서 원소를 추가할 때는 set1.add() 메소드를 사용할 수 있다
s1 = {'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'}            # {'Kiwi', 'Orange', 'Apple', 'Melon'} <class 'set'>
s2 = set(['Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'])       # {'Kiwi', 'Orange', 'Apple'} <class 'set'>
s3 = {3}                                                       # {3} <class 'set'>
s4 = set() # Not {}                                            # set() <class 'set'>
s5 = frozenset({'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'}) # frozenset({'Kiwi', 'Orange', 'Apple'}) <class 'frozenset'>

 

Set 생성 속도차이

파이썬인터프리터가 바이트코드를 실행하는데, dis 를 활용하면, 그 과정을 확인할 수 있다. 이를 통해 set([원소1, 원소2,...]){원소1, 원소2,...} 방법 간에 실행 속도 차이를 확인해보자

from dis import dis

print('------')
print(dis('{10}'))

print('------')
print(dis('set([10])'))

"""
------
  1           0 LOAD_CONST               0 (10)
              2 BUILD_SET                1
              4 RETURN_VALUE
None
------
  1           0 LOAD_NAME                0 (set)
              2 LOAD_CONST               0 (10)
              4 BUILD_LIST               1
              6 CALL_FUNCTION            1
              8 RETURN_VALUE
None
"""

결과를 보면 {원소1, 원소2,,...} 를 활용하는 방식이 속도가 더 빠름을 알 수 있다. 다루는 데이터가 많아질수록 set() 자료를 만드는 속도 차이 또한 유의미해질 수 있기 때문에 이러한 차이를 알고 사용하는 것이 유용할 수 있다.

 

Set Comprehension

Set 또한 Comprehension을 활용하여 정의할 수 있다. 아스키코드에 맵핑된 번호와 문자, 그리고 해당 문자의 이름을 원소로 가지는 tuple 을 원소로 갖는 Set 객체를 생성한 예시이다

from unicodedata import name
print( {name(chr(i), '') for i in range(0,10)} ) # {(58, ':', 'COLON'), (103, 'g', 'LATIN SMALL LETTER G'), ....

관련글 더보기

댓글 영역