[Python3] set 사용법({dictionary})

민갱·2023년 7월 8일

Python

목록 보기
9/11

문제를 풀다가 set이 필요한 내용이 있어 공부겸 정리 한다.

1. set()이란?

  • set()집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.
  • 집합 자료형은 다음과 같이 set 키워드를 사용한다.
  • 집합 자료형은 다른 자료형의 중복 제거할때 사용한다.
s1 = set([1,2,3])
print(s1)

=> {1,2,3}

1.1 공식 문서

  • set() -> new empty set object
    set()으로 선언하면 새로운 비어있는 set객체를 생성한다.
  • set(iterable) -> new set object
    set을 생성할때 인자로 iterable 한 객체를 집어 넣게 되면 iterable을 이용해 새로운 set 객체를 생성 한다.
    • set({1,2,3}) , set([1,2,3])과 같이 선언한다.
  • 중요! Build an unordered collection of unique elements
    순서가 정해져있지 않고, 중복되지 않는 고유한 요소로 새로운 set객체를 만든다

1.2 set 특징

  • set() 키워드 혹은 중괄호를 이용한다.
  • 순서가 없습니다.
  • 고유한 값을 가집니다. (값 중복 불가능)
  • mutable(=값이 변하는) 객체이다.
  • *순서가 없기 때문에 리스트나 튜플에서 사용했던 인덱싱이 불가능하다.

2. 교집합, 합집합, 차집합, 동일 여부

2.1 교집합(setA.intersection(setB))

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
 
# 교집합 메서드 intersection
print(s1.intersection(s2))
 
# 교집합 연산자 &
print(s1 & s2)

==>
{4,5}
{4,5}
  • 교집합을 구할때 intersection 메서드& 연산자를 사용하여 교집합을 구할 수 있다.

2.2 합집합(setA.union(setB))

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
 
# 합집합 메서드 union
print(s1.union(s2))
 
# 합집합 연산자 |
print(s1 | s2)

=>
{1,2,3,4,5,6,7,8,}
{1,2,3,4,5,6,7,8,}
  • 합집합을 구할때 union 메서드| 연산자 를 사용하여 합집합을 구할 수 있다.

2.3 차집합(setA.difference(setB))

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
 
# 차집합 메서드 difference
print(s1.difference(s2))
print(s2.difference(s1))
 
# 차집합 연산자 -
print(s1 - s2)
print(s2 - s1)

=> 

{1,2,3}
{8,6,7}

{1,2,3}
{8,6,7}
  • 순서가 바뀌어도 상관이 없는 교집합, 합집합과 달리 차집합은 순서가 상관이 있다.
  • 차집합을 구할때 difference 메서드- 연산자를 사용하여 차집합을 구할 수 있다.

2.4 대칭 차집합(setA.symmetric_difference(setB))

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
 
# 차집합 메서드 difference
print(s1.symmetric_difference(s2))
print(s2.symmetric_difference(s1))

=> 

{1,2,3,6,7,8}
{1,2,3,6,7,8}

2.5 동일 여부(교집합이면 False, 교집합이 아니면 True)

  • set이 같은지
s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
s3 = {1, 2, 3, 4, 5}
 
if s1 == s2:
    print("s1과 s2은 같습니다.")
else:
    print("s1과 s2은 다릅니다.")
 
if s1 == s3:
    print("s1과 s3은 같습니다.")
else:
    print("s1과 s3은 다릅니다.")
  • set은 순서가 상관없이 set의 모든 요소가 같을때만 같은 동일하다고 말한다.
  • set이 아예 다른지 == 같은 요소가 없다.
    (setA.isdisjoint(setB))

s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7, 8])
s3 = {1, 2, 3, 4, 5}
s4 = {6, 7, 8, 9, 10}
 
if s1.isdisjoint(s2):
    print("s1과 s2은 같은 요소가 하나도 없습니다.")
else:
    print("s1과 s2은 같은 요소가 적어도 하나는 있습니다.")
 
if s1.isdisjoint(s3):
    print("s1과 s3은 같은 요소가 하나도 없습니다.")
else:
    print("s1과 s3은 같은 요소가 적어도 하나는 있습니다.")
 
if s1.isdisjoint(s4):
    print("s1과 s4은 같은 요소가 하나도 없습니다.")
else:
    print("s1과 s4은 같은 요소가 적어도 하나는 있습니다.")

if s1 != s4:
    print("s1과 s4은 같은 요소가 하나도 없습니다.")
else:
    print("s1과 s4은 같은 요소가 적어도 하나는 있습니다.")
    
==>
s1과 s2는 같은 요소가 적어도 하나는 있습니다.
s1과 s3은 같은 요소가 적어도 하나는 있습니다.
s1과 s4은 같은 요소가 하나도 없습니다.
s1과 s4은 같은 요소가 하나도 없습니다.
  • set요소가 다른것은 요소가 하나라도 다르면 다른것 이다.
  • set요소가 다름의 검사는 isdisjoint 메소드!= 연산자로 한다.
  • set에서 공통된 부분이 하나도! 없다. 를 의미한다.
    • 교집합이 없다.
    • 두 set 객체에 모든 요소가 다르다.

2.6 부분 집합 여부(setA.issubset(setB))

s1 = {1,2,3,4}
s2 = {3,4}
s3 = s1.issubset(s2)
print('부분집합' ,s3)
s3 = s2.issubset(s1)
print('부분집합',s3)
=>
부분집합 False
부분집합 True

2.7 상위 집합 여부(setA.issuperset(setB) - issubset과 결과 반대)

s1 = {1,2,3,4}
s2 = {3,4}
s3 = s1.issuperset(s2)
print('상위집합' ,s3)
s3 = s2.issuperset(s1)
print('상위집합',s3)
=>
부분집합 True
부분집합 False

3.집합 자료형 관련 함수들(add, update, remove, discard, pop, clear, in, len)

3.1 set add - 요소 추가

s = {1, 2, 3}
print(f'set : {s}')
 
s.add('blockdmask')
print(f'set : {s}')
 
s.add('blockdmask') # 중복 값
print(f'set : {s}')
 
s.add(4)
print(f'set : {s}')

==>
set : {1,2,3}
set : {1,2,3,'blockmask'}
set : {1,2,3,'blockmask'}
set : {1,2,3,'blockmask',4}
  • setA.add() 메서드를 이용하면 set 내부에 원하는 값을 추가 할 수 있다.
  • 이 set의 특징인 '중복 제거'에 의해 만들어진 결과이고, 중복값을 넣어도 오류가 발생하지 않는다.

3.2 set update - 요소 여러개 추가

s = {1, 2, 3}
print(f'set : {s}')
 
s.update({'a', 'b', 'c'})
print(f'set : {s}')
 
s.update([11, 12, 13])
print(f'set : {s}')

==>
set : {1,2,3}
set : {1,2,3,'b','c','a'}
set : {1,2,3,'b',11,13,'c','a',12}
  • set.update() 메서드를 이용하면 집합의 값을 한번에 여러개 추가 할 수있다.

3.3 set remove - 특정 요소 제거

s = {'kim', 'lee', 'park', 2, 3, 4}
print(f'집합 : {s}')
 
s.remove("kim")
print(f'집합 : {s}')
 
# 에러 발생
# s.remove("kim")
# print(f'집합 : {s}')

==>
집합 : {2,3,4, 'lee', 'kim', 'park'}
집합 : {2,3,4, 'lee', 'park'}
  • set.remove() 메서드를 이용하면 집합의 특정 요소를 제거 할 수있다. 하지만 요소가 없으면 오류 발생
  • set 내부에 요소가 있으면 삭제
  • set 내부에 요소가 없으면 오류

3.4 set discard - 특정 요소 안전하게 제거


s = {'kim', 'lee', 'park', 2, 3, 4}
print(f'집합 : {s}')
 
s.discard("lee")
print(f'집합 : {s}')
 
s.discard("lee")
print(f'집합 : {s}')

==>
집합 : {'park', 2, 3, 4, 'lee', 'kim'}
집합 : {'park', 2, 3, 4, 'kim'}
집합 : {'park', 2, 3, 4, 'kim'}
  • set.discard() 메서드를 이용하면 안전하게 요소를 제거 할 수 있다.(요소가 없어도 에러가 발생하지 않는다.)
  • set 내부에 값이 있으면 삭제
  • set 내부에 값이 없으면 아무런 액션 없음

3.5 set pop - 임의의 요소를 갖고 온 후 제거


s = {'r', 'a', 'n', 'd', 'o', 'm'}
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
print(f'집합.pop() : {s.pop()}')
print(f'집합 : {s}')
 
# 이미 비어있는 집합 이므로 pop 불가. error 발생.
# print(f'집합.pop : {s.pop()}')
# print(f'집합 : {s}')

==>
집합 : {'a', 'm', 'r', 'n', 'd', 'o'}
집합.pop() : a
집합 : {'m', 'r', 'n', 'd', 'o'}
집합.pop() : m
집합 : {'r', 'n', 'd', 'o'}
집합.pop() : r
집합 : {'n', 'd', 'o'}
집합.pop() : n
집합 : {'d', 'o'}
집합.pop() : d
집합 : {'o'}
집합.pop() : o
집합 : set()
  • set.pop() 함수는 set 요소들 중 맨 앞의 요소를 꺼내고 제거한다. 하지만 실제로는 set에는 순서가 없기 때문에 임의의 요소를 제거하는게 맞다.
  • set이 비어있는 상태에서 pop() 메서드를 호출하면 에러가 발생한다.
  • set이 비어있는지 확인한 후에 set.pop() 메서드를 사용해야한다.

set clear - 모든 요소 제거


s = {'e', 'f', 'g', 11, 12, 13}
print(f'집합 s : {s}')
 
s.clear()
print(f'clear 후 집합 : {s}')

==>
집합 s : {'e', 'f', 'g', 11, 12, 13}
clear 후 집합 : set()
  • set.clear()를 이용해서 집합 내부의 모든 요소를 제거할 수 있다.
profile
가보자고

0개의 댓글