세트(set)는 집합을 표현하는 자료형이다. 세트는 합집합, 교집합, 차집합 등의 연산이 가능하다.
- 세트 = {값1, 값2, 값3}
smartphones = {'iphone', 'galaxy', 'lg', 'iphone'}
print(smartphones)
{'galaxy', 'lg', 'iphone'}
값이 있는지 확인하기
- 값 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(반복가능한객체) # 객체(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가 겹친다