TIL | 파이썬 집합을 표현하는 set 자료형

박지우·2021년 4월 19일
0

TIL

목록 보기
4/7
post-thumbnail

집합 = set
수학의 집합개념과 같음

수학에서, 집합(集合, 영어: set)은 특정한 조건에 맞는 원소들의 모임이며, 명확한 기준에 의하여 주어진 서로 다른 대상들이 모여 이루는 새로운 대상이다. 어떤 대상이 집합에 속하는지 여부는 명확해야 하며, 집합 위에는 순서나 연산 따위의 구조가 주어지지 않는다. 집합은 수학에서 가장 기본적인 개념이다. 위키백과참고

세트의 기본 형태 : 세트는 {}(중괄호) 안에 값을 저장하며 각 값은,(콤마)로 구분해줌
ex) 세트 = {값1, 값2, 값3}

family = {'father','mother','sister','brother'}

주의
세트의 요소는 순서가 정해져 있지 않음(unordered)
그러므로 출력시 매번 요소의 순서가 다르게 나옴

세트에 들어가는 요소는 중복 될 수 없음
같은 요소가 2개 이상 중복 될 경우 같은 요소 중 1개만 남음

세트는 리스트, 튜플, 딕셔너리와는 다르게 대괄호 [] 로 특정 요소만 출력할 수는 없다.
-> 세트에 특정 값이 있는지 확인은 가능
in : 있는걸 확인함
not in : 없는걸 확인함

set 만들기

set (반복 가능한객체, iterable이터레이트 참고)

문자열 사용

a = set('apple')
print(a)
#결과 {'l', 'p', 'e', 'a'} 

중복된 'p' 2개중 하나 삭제, 유일한 문자들만 남게함 (중복된 문자는 포함하지 않는다.)


range 사용

b = set(range(5))
print(b)
#결과 {0, 1, 2, 3, 4}

빈 세트

c = set()

set에 아무것도 지정하지 않으면 됨.

주의
set의 기본 형태 {}를 사용하여 빈 세트를 만들면
세트가 아닌 딕셔너리가 만들어짐
-> type(set) 로 형태 확인 가능

list 와 다르게 set는 중첩할 수 없다 (set 안의 set 만들 수 없음.)

set 를 중첩하고 싶다면?
frozenset 사용가능
말그대로 얼어있는set 라 집합연산과 메서드에서 요소를 추가하거나 삭제하는 연산,메서드는 사용할수 없음

frozenset({frozenset({1, 2}), frozenset({3, 4})}) # 이런형태로 중첩가능

중첩은 frozenset 끼리만 가능하고 일반 set는 frozenset에 중첩할 수 없음.

집합 연산 사용

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

합집합 ( union , | )

set.union() 메서드와 동작이 같음

a = {1,2,3,4}
b = {3,4,5,6}
print(a|b) # a 와 b 의 합집합
print(set.union(a,b)) # a 와 b 의 합집합

교집합(intersection , &)

set.intersection() 메서드와 동작이 같음

print(a&b) #a와 b의 교집합
print(set.intersection(a,b))#a와 b의 교집합

차집합 (difference , - )

set.difference() 메서드와 동작이 같음

print(a-b) # 순서가 바뀌면 값이 달라짐 현재는 a 에서 b 요소를 제거
print(set.difference(a,b))

대칭차집합 (symmetric difference , ^)

XOR 연산자 ^ 를 사용함
XOR(배타적OR) : 서로다른것만 해당 겹치지 않은것들만 해당, XOR은 서로 다르면 참

set.symmetric_difference() 메서드와 동작이 같음

집합에서는 두 집합 중 겹치지 않는 요소만 포함함

print(a^b)
print(set.symmetric_difference(a,b)) # 서로 다른걸 보여주세요. 교집합빼고 보여주세요

할당 연산자 사용

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

update

|= 은 현재 세트에 다른 세트를 더하며 update 메서드와 같음

# 세트1 |= 세트2
t = {1,2,3,4}
t |= {5} 
print(t) # 결과 {1,2,3,4,5}

#세트1.update(세트2)
t.update({5})
print(t) # 결과 {1,2,3,4,5}

intersection_update

&= 는 현재 세트와 다른 세트의 겹치는 요소만 현재 세트에 저장 한다.
intersection_update() 메서드와 같음

t = {1,2,3,4}
t &= {0,1,2,3,4}
print(t) #결과 {1,2,3,4} 겹치지 않는 0은 제외

t.intersection_update({0,1,2,3,4})
print(t) #결과 {1,2,3,4}

difference_update

-= 는 현재 세트에서 다른 세트를 뺀다.
difference_update() 메서드와 같음

t = {1,2,3,4}
t -= {1,2,3}
print(t) #결과 {4} 겹치지 않는 0은 제외

t.difference_update({1,2,3})
print(t) #결과 {4}

symmetric_difference_update

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

t = {1,2,3,4}
t ^= {3,4,5,6}
print(t) #결과 {1,2,5,6} 겹치는 3,4 제외

t.symmetric_difference_update({3,4,5,6})
print(t) #결과 {1,2,5,6}

집합 연산 사용

부분 집합과 상위 집합 확인

현재 세트가 다른 세트의 부분집합 또는 상위집합인지 확인할 때는 세트 자료형에 부등호와 등호를 사용한다.

<= 부분집합 (subset)

<=는 현재 세트가 다른 세트의 부분집합인지 확인한다.
issubset() 메서드와 같음

현재세트 <= 다른세트
현재세트.inssubset(다른세트)

결과는 True or False

< 진부분집합 (proper subset)

현재세트가 다른 세트의 진부분집합인지 확인한다.
메서드는 없음

부분집합이지만 같지는 않을 때 참임 (동일한 부분을 제외한것)

현재 세트 < 다른세트

>>> a = {1,2,3,4}
>>> a < {1,2,3,4,5}
True

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

>= 상위집합(superset)

>= 은 현재 세트가 다른 세트의 상위 집합인지 확인
issuperset() 메서드와 같음

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

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

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

>>> a.issuperset({1,2,3,4})
True

> 진상위집합(proper superset)

>= 은 현재 세트가 다른 세트의 상위 집합인지 확인
메서드는 없음
상위 집합이지만 같지는 않을 때 참임

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

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

세트가 같은지 다른지 확인하기

세트가 같은지 확인하기 (==)

== 연산자 사용

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

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

요소만 같으면 순서 상관없음 말그대로 집합


세트가 다른지 확인하기 (!=)

!= 연산자 사용

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

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

세트가 겹치지 않는지 확인하기 (disjoint)

disjoint 는 현재 세트가 다른 세트와 겹치지 않는지 확인한다.

현재세트.isdisjoint(다른세트)

>>> a = {1,2,3,4}
>>> a.isdisjoint{5,6,7,8} # 겹치는 요소가 없음
True

>>> a.isdisjoint{3,4,5,6} # 3,4가 겹침
False

세트조작하기

.add(요소) : 세트에 요소를 추가
.remove(요소) : 세트에서 특정 요소를 삭제하고 요소가 없으면 에러발생
.discard(요소) : 세트에서 특정 요소를 삭제하고 요소가 없으면 그냥 넘어감.
.pop() :세트에서 임의의 요소를 삭제하고 해당 요소를 반환. 요소가 없으면 에러
.clear() : 세트의 모든 요소를 삭제
len(세트) : 세트의 요소 개수 구함.

세트의 할당과 복사

딕셔너리와 마찬가지로 할당과 복사의 차이점이 있으니 주의해야함

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

print(a is b) #True

위와 같이 할당을 하게되면 a 와 b 는 같은 하나의 세트 객체를 가르키게 된다.

a 와 b 를 각각 다른 객체로 만드려면 .copy() 메서드를 사용해야한다.

a = {1,2,3,4}
b = a.copy()

print(a is b) #False
profile
Backend developer

0개의 댓글