TIL 32 | 세트 사용하기

ryan·2020년 8월 14일
0

Python

목록 보기
17/18

세트(set)는 집합을 표현하는 자료형이다. 세트는 합집합, 교집합, 차집합 등의 연산이 가능하다.

세트를 만들어보자

  • 세트 = {값1, 값2, 값3}
smartphones = {'iphone', 'galaxy', 'lg', 'iphone'}
print(smartphones)

{'galaxy', 'lg', 'iphone'}
  • 세트는 요소의 순서가 정해져 있지 않다(unordered).
  • 세트에 들어가는 요소는 중복될 수 없다.
  • 세트는 리스트, 튜플, 딕셔너리와는 다르게 로 특정 요소만 출력할 수 없다.

세트에 특정 값이 있는지 확인해보자

값이 있는지 확인하기

  • 값 in 세트
smartphones = {'iphone', 'galaxy', 'lg', 'iphone'}
print('galaxy' in smartphones)
print('xiaomi' in smartphones)

True
False

값이 없는지 확인하기

  • 값 not in 세트
smartphones = {'iphone', 'galaxy', 'lg', 'iphone'}
print('galaxy' not in smartphones)
print('xiaomi' not in smartphones)

False
True

set를 사용해서 세트를 만들어보자

set(반복가능한객체) # 객체(iterable)

a = set('google')		# 유일한 문자만 세트로 만든다.
print(a)

{'e', 'g', 'l', 'o'}
b = set(range(10))
print(b)

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
c = set()
print(c)

set()

주의, 세트가 { }(중괄호)를 사용한다고 해서 c = { }와 같이 만들면 빈 딕셔너리가 만들어진다.

  • type(객체)
c = {}
print(type(c))

d = set()
print(type(d))

<class 'dict'>
<class 'set'>

프로즌 세트

변경할 수 없는 세트
프로즌 세트 = frozenset(반복가능한객체)
frozen set는 세트 안에 세트를 넣고 싶을 때 사용한다.

a = frozenset(range(5))
print(a)

frozenset({0, 1, 2, 3, 4})

집합 연산을 사용해보자

집합 연산은 파이썬의 산술 연산자와 논리 연산자를 활용한다.

| 연산자는 합집합(union)을 구하고, or 연산자인 |를 사용한다.

  • 세트1 | 세트2
  • set.union(세트1, 세트2)
a = {10, 20, 30, 40}
b = {30, 40, 50, 60}
print(a | b)
print(set.union(a, b))

{40, 10, 50, 20, 60, 30}
{40, 10, 50, 20, 60, 30}	# 왜 랜덤으로 출력되지? vs code야?

& 연산자는 교집합(intersection)을 구하며 AND 연산자 &를 사용한다.

  • 세트1 & 세트2
  • set.intersection(세트1, 세트2)
a = {10, 20, 30, 40}
b = {30, 40, 50, 60}
print(a & b)
print(set.intersection(a, b))

{40, 30}
{40, 30}

'-' 연산자는 차집합(difference)을 구하고, 뺄셈 연산자 -를 사용한다.

  • 세트1 - 세트 2
  • set.difference(세트1, 세트2)
a = {10, 20, 30, 40}
b = {30, 40, 50, 60}
print(a - b)
print(set.difference(a, b))

{10, 20}
{10, 20}

^ 연산자는 대칭차집합(symmetric difference)을 구하고, XOR 연산자 ^를 사용한다. 두 집합 중 겹치지 않는 요소만 포함한다.

  • 세트1 ^ 세트2
  • set.symmetric_difference(세트1, 세트2)
a = {10, 20, 30, 40}
b = {30, 40, 50, 60}
print(a ^ b)
print(set.symmetric_difference(a, b))

{10, 50, 20, 60}
{10, 50, 20, 60}

집합을 연산한 후에 할당 연산자를 사용해보자

세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 = 을 함께 사용하면 집합 연산의 결과를 변수에 다시 저장(할당)한다.

|=은 현재 세트에 다른 세트를 더하고, update 메서드와 같다.

  • 세트1 |= 세트2
  • 세트1.update(세트2)
a = {10, 20, 30, 40}
a |= {5}
print(a)

{20, 5, 40, 10, 30}


a = {10, 20, 30, 40}
a.update({5})
print(a)

{20, 5, 40, 10, 30}

&=은 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장하고, intersection_update 메서드와 같다.

  • 세트1 &= 세트2
  • 세트1.intersection_update(세트2)
a = {10, 20, 30, 40}
a &= {0, 10, 20, 30, 40}
print(a)

{40, 10, 20, 30}

a = {10, 20, 30, 40}
a.intersection_update({0, 10, 20, 30, 40})
print(a)

{40, 10, 20, 30}

-=은 현재 세트에서 다른 세트를 빼고, difference_update 메서드와 같다.

  • 세트1 -= 세트2
  • 세트1.difference_update(세트2)
a = {10, 20, 30, 40}
a -= {20}
print(a)

{40, 10, 30}

a = {10, 20, 30, 40}
a.difference_update({20})

print(a)

{40, 10, 30}

^=은 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하고, symmetric_difference_update 메서드와 같다.

  • 세트1 ^= 세트2
  • 세트1.symmetric_difference_update(세트2)
a = {10, 20, 30, 40}
a ^= {30, 40, 50, 60}
print(a)

{10, 50, 20, 60}

a = {10, 20, 30, 40}
a.symmetric_difference_update({30, 40, 50, 60})

print(a)

{10, 50, 20, 60}

부분 집합과 상위집합을 확인해보자

세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 세트 자료형에 부등호와 등호를 사용해서 표현할 수 있다.

<=은 현재 세트가 다른 세트의 부분집합(subset)인지 확인하고, issubset 메서드와 같다.

  • 현재세트 <= 다른세트
  • 현재세트.issubset(다른세트)
a = {10, 20, 30, 40}
print(a <= {10, 20, 30, 40})
print(a.issubset({10, 20, 30, 40, 50}))

True
True

<은 현재 세트가 다른 세트의 진부분집합(proper subset)인지 확인하고, 메서드는 없다.

  • 현재세트 < 다른세트
a = {10, 20, 30, 40}
print(a < {10, 20, 30, 40, 50})

True

'>='은 현재 세트가 다른 세트의 상위집합(superset)인지 확인하고, issuperset 메서드와 같다.

  • 현재세트 >= 다른세트
  • 현재세트.issuperset(다른세트)
a = {10, 20, 30, 40}
print(a >= {10, 20, 30, 40})
print(a.issuperset({10, 20, 30, 40}))

True
True

'>'은 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인하고, 메서드는 없다.

  • 현재세트 > 다른세트
a = {10, 20, 30, 40}
print(a > {10, 20, 30})

True

세트가 같은지 다른지 확인해보자

세트는 ==연산자를 사용해서 서로 같은지 확인할 수 있다.

a = {10, 20, 30, 40}
print(a == {10, 20, 30, 40})
print(a == {40, 20, 30, 10})

True
True	# 순서 x 요소만 같으면 참이다.

!= 연산자는 세트가 다른지 확인한다.

a = {10, 20, 30, 40}
print(a != {10, 20, 30})

True

세트가 겹치지 않는지 확인해보자

disjoint는 현재 세트가 다른 세트와 겹치지 않는지 확인한다. 겹치는 요소가 없으면 True, 있으면 False다.

  • 현재세트.isdisjoint(다른세트)
a = {10, 20, 30, 40}
print(a.isdisjoint({50, 60, 70, 80, 90, 100}))

print(a.isdisjoint({30, 40, 50, 60}))

True		# 겹치는 요소가 없다
False		# a와 30, 40가 겹친다
profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글