2 minute read

본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.

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