set 은 사실 집합연산에 활용할 수 있는 메소드들에 대해 잘 아는게 중요하다고 생각되지만, 지금은 개념과 comprehension, frozen set 사용법 정도 정리하고자 한다
Mutable하지만 원소의 중복을 허락하지 않는 set은 원소를 집합으로 다루며, 집합연산이 가능한 자료구조이다
set([원소1, 원소2,...])
와 {원소1, 원소2,...}
와 같은 두가지 방식이 가능하다{}
로 정의할 경우 Dict가 생성되기 때문에, set()
로 생성해야한다frozenset
을 활용한다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'>
파이썬인터프리터가 바이트코드를 실행하는데, 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을 활용하여 정의할 수 있다. 아스키코드에 맵핑된 번호와 문자, 그리고 해당 문자의 이름을 원소로 가지는 tuple 을 원소로 갖는 Set 객체를 생성한 예시이다
from unicodedata import name
print( {name(chr(i), '') for i in range(0,10)} ) # {(58, ':', 'COLON'), (103, 'g', 'LATIN SMALL LETTER G'), ....
Deep, Shallow Copy (2) - Mutable vs Immutable (0) | 2022.04.29 |
---|---|
Deep, Shallow Copy (1) - 반복을 통한 List 생성 2가지 비교 (0) | 2022.04.28 |
dict와 hash, defaultdict 와 frozendict (0) | 2022.04.26 |
Comprehension (List, Dict), Generator (0) | 2022.04.25 |
NamedTuple (0) | 2022.04.20 |
댓글 영역