본문 바로가기
python

set

by csue 2021. 4. 27.

set

집합을 표현하는 자료형을 의미한다.
list 와 마찬가지로 여러 타입의 요소들을 저장할 수 있으나, list 와는 달리 세트에 들어가는 요소는 중복될 수 없으며, 만일 동일한 값의 요소가 이미 존재하고 있다면 새로운 요소가 이전의 요소를 치환(replace) 한다.
순서가 정해져있지 않아 indexing 이 되어 있지 않다. 또, 출력할때마다 순서가 다르게 나타나고, 특정 요소만 출력할 수 없다. 세트 안에 또 세트를 만들 수도 없다.

>>> 과일 = {'사과', '딸기', '바나나'}

>>> 과일
{'딸기', '사과', '바나나'}

>>> 과일['딸기']
TypeError: 'set' object is not subscriptable

look up

특정 값이 있는지 확인하기 위해 in 키워드를 사용한다.

#값 in 세트
>>> 과일 = {'사과', '딸기', '바나나'}
>>> '딸기' in 과일
True
>>> '감자' in 과일
False

세트 만들기

>>> a = set('apple')
>>> a
{'e', 'a', 'p', 'l'} # 중복되는 문자는 포함하지 않는다.

 

>>> b = set(range(3))
>>> b
{0, 1, 2} # 이 경우 순서대로 나온다.

 

#빈 세트 만들기
>>> c = set()

# c={}라고 만들면 빈 딕셔너리가 만들어진다.

반복문 (for 변수 in 세트: )

세트에는 순서가 없으므로 꺼낼때마다 순서가 달라진다. (단, 숫자로만 이루어진 세트는 순서대로 출력됨)

반복문으로 세트 생성하기

{식 for 변수 in 반복가능한객체} =
set(식 for 변수 in 반복가능한객체)

>>> {i for i in 'berry'}
{'y', 'r', 'e', 'b'} # 중복되는 문자는 제거되어 나온다.

if 조건문으로 세트 생성하기

{식 for 변수 in 세트 if 조건식} =
set(식 for 변수 in 세트 if 조건식)

>>> a = {i for i in 'berry' if i in 'b'}
>>> a
{'b'} # 조건문대로 b만 포함된다.
>>> a = {i for i in 'berry' if i not in 'b'}
>>> a
{'y', 'e', 'r'} # 조건문대로 b만 빠진다.

세트 값 수정하기

add

set.add()

remove

set.remove()

discard

특정 요소를 삭제하고, 해당 요소가 없으면 그냥 넘어간다.

pop

임의의 요소를 삭제하고 해당 요소를 반환한다.

>>> a = {1, 2, 3, 4}
>>> a.pop()
1
>>> a
{2, 3, 4} # 1을 삭제했다.

# pop(n) 이라고 쓸 경우 에러가 발생한다.

clear

세트와 집합의 method

합집합(union) : |

>>> a = {1, 2, 3}
>>> b = {3, 4, 5}
>>> a | b # set.union(a, b)를 써도 같다.
{1, 2, 3, 4, 5}

교집합(intersection) : &

>>> a & b # set.intersection(a, b)를 써도 같다.
{3}

차집합(difference) : -

>>> a - b # set.difference(a, b)를 써도 같다.
{1, 2}

대칭차집합(symmetric difference) : ^

>>> a ^ b # set.symmetric_difference(a, b)를 써도 같다.
{1, 2, 4, 5} 

세트가 같은지 다른지 확인하기 (T/F)

== 연산자는 같은지 확인할 때, ! 연산자는 다른지 확인할 때 사용한다.

cf) disjoint : 세트 내에 겹치는 요소가 있는지 확인한다.
겹치는 요소가 없으면 T, 있으면 F

>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6})
True
>>> a.isdisjoint({3, 4})
False

집합 연산 후 할당 연산자 사용하기

세트1 |= 세트2

현재 세트에 다른 세트(세트2)를 더한다.
세트1.update(세트2) 와 같다.

>>> a = {1,2,3}

>>> a |= {4}
>>> a
{1, 2, 3, 4}

>>> a.update({5})
{1, 2, 3, 4, 5}

세트1 &= 세트2

현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장한다.
세트1.intersection_update(세트2) 와 같다.

>>> a = {1, 2, 3, 4}

>>> a &= {3, 4, 5, 6}
>>> a
{3, 4}

세트1 -= 세트2

현재 세트에서 다른 세트를 뺀다.
세트1.difference_update(세트2) 와 같다.

>>> a = {1, 2, 3, 4}

>>> a -= {3, 4}
>>> a
{1, 2}

세트1 ^= 세트2

현재 세트와 다른 세트 중 겹치지 않는 요소만 현재 세트에 저장한다.
세트1.symmetrric_difference_update(세트2) 와 같다.

>>> a = {1, 2}
>>> a.symmetric_difference_update({2 ,3 ,4})
>>> a
{1, 3, 4}

현재세트 <= 다른세트

현재 세트가 다른 세트의 부분집합인지 확인한다. (T/F)
현재세트.issubset(다른세트) 와 같다.
등호가 없을때에는 진부분집합일때만 성립하며 method는 따로 없다.

현재세트 >= 다른세트

현재 세트가 다른 세트의 상위집합인지 확인한다. (T/F)
현재세트.issuperset(다른세트) 와 같다.
등호가 없을때에는 진상위집합일때만 성립하며 method는 따로 없다.

할당과 복사

dictionary 처럼 copy method를 사용해야 한다.

# 단순 할당 시,
>>> a = {1, 2, 3}
>>> b = a
>>> a is b
True

# 이 경우 한 쪽을 수정하면 반대쪽에도 반영된다 (dic과 같다)
#copy method 사용 시,
>>> a = {1, 2, 3}
>>> b = a.copy()
>>> a == b
True
>>> a is b
False

set를 이용하여 공배수 구하기

>>> a = {i for i in range(1, 101) if i % 3 == 0}
# 1~100 까지의 숫자 중 3 으로 나눴을 때 0이 나오는 수
>>> b = {i for i in range(1, 101) if i % 5 == 0}

>>> print(a & b)

{75, 45, 15, 90, 60, 30}

 

'python' 카테고리의 다른 글

array & tuple & set  (0) 2021.04.27
args & kwargs  (0) 2021.04.27
dictionary  (0) 2021.04.27
list  (0) 2021.04.27
if & while  (0) 2021.04.27