[Python] 13. 지료형 분류와 set & frozenset
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
13-1. 자료형 분류
- 시퀀스 타입: 저장된 값의 순서 정보 존재
Ex) 리스트, 튜플, 레인지, 문자열
- 인덱싱 연산: 특정 값 하나 참조
Ex) a[0], a[1], … - 슬라이싱 연산: 시작과 끝 정하여 참조
Ex) a[0:3]
- 인덱싱 연산: 특정 값 하나 참조
-
매핑 타입: 저장된 값의 순서나 위치 정보를 기록하지 않는 자료형(3.7부터는 저장 값 순서 유지하지만 인덱싱이나 슬라이싱 연산 불가능)
Ex) 딕셔너리 - 셋 타입: 수학의 집합을 표현한 자료형. 저장 순서 정보 없고 중복된 값의 저장도 허용하지 않는다.
Ex) 셋, 프로즌 셋
13-2. set
A = {'a', 'b', 'c', 'd'}
B = set(['a', 'b', 'd', 'e']) # set함수는 iterable 객체를 입력으로 활용한다.
C = set('edba')
A - B # 차집합
A & B # 교집합
A | B # 합집합
A ^ B # 대칭 차집합, (A-B) U (B-A)
B == C # 저장 순서 상관없이 값만 같으면 된다!
'a' in B
'c' not in B
for c in A | B:
print(c, end = ' ')
(결과) {'c'}
{'d', 'a', 'b'}
{'b', 'd', 'a', 'c', 'e'}
{'c', 'e'}
True
True
True
b d a c e
빈 set을 생성하려면 다음을 참고하라.
a = {} # 이렇게 하면 빈 dictionary가 생성된다!
b = set()
type(a)
type(B)
(결과) <class 'dict'>
<class 'set'>
셋은 중복된 값들을 하나만 남기고 삭제하는데 활용할 수도 있다.
l = [2, 2, 2, 2, 5, 5, 5, 'ㅋ', 'ㅋ']
r = list(set(l))
r
(결과) [2, 'ㅋ', 5]
13-3. frozenset, set과 frozenset 차이
13-2의 첫 코드에 set 대신 frozenset을 적용해도 set과 동일해보인다.
A = frozenset(('a', 'b', 'c', 'd'))
B = frozenset(['a', 'b', 'd', 'e']) # set함수는 iterable 객체를 입력으로 활용한다.
C = frozenset('edba')
A - B # 차집합
A & B # 교집합
A | B # 합집합
A ^ B # 대칭 차집합, (A-B) U (B-A)
B == C # 저장 순서 상관없이 값만 같으면 된다!
'a' in B
'c' not in B
for c in A | B:
print(c, end = ' ')
(결과) frozenset({'c'})
frozenset({'d', 'a', 'b'})
frozenset({'b', 'd', 'a', 'c', 'e'})
frozenset({'c', 'e'})
True
True
True
b d a c e
그러나 이들은 차이가 있다.
set: Mutable 객체라 값의 추가, 삭제 가능
frozenset: Immutable 객체라 값의 추가, 삭제 불가능
set이 Mutable 객체이므로 다음과 같은 메소드 또는 연산을 수행할 수 있다.
l = {1, 2, 3, 4, 5}
l.add(6) # 원소 추가
l
l.discard(1) # 원소 삭제
l
l.update({7, 8, 9}) # 다른 집합의 원소 전부 추가, l |= {7, 8, 9} 와 동일
l
l.intersection_update({2, 4, 6, 8}) # 다른 집합과 공통의 원소만 남기기, l &= {2, 4, 6, 8} 와 동일
l
l.difference_update({2, 4}) # 다른 집합이 갖는 원소 모두 삭제, l -= {2, 4} 와 동일
l
l.symmetric_difference_update({1, 3, 6}) # 공통으로 갖지 않는 것들 추가하고 공통으로 갖는건 삭제하며 나머지는 그대로 둠, l ^= {1, 3, 6} 와 동일
l
(결과) {1, 2, 3, 4, 5, 6}
{2, 3, 4, 5, 6}
{2, 3, 4, 5, 6, 7, 8, 9}
{8, 2, 4, 6}
{6, 8}
{1, 3, 8}
13-4. set 컴프리헨션
sc1 = {x for x in range(1, 11)}
sc2 = {2*x for x in sc1}
sc3 = {x for x in sc2 if x<10}
sc1
sc2
sc3
(결과) {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
{8, 2, 4, 6}
Leave a comment