본문 바로가기

Python 파이썬

파이썬 기초(3-3) - 집합(Set)

  • Python은 여러 값을 갖는 컨테이너 자료형 제공
    • 리스트(List) : 대괄호 사용   ex) [0,1,2,3]
    • 튜플(Tuple) : 소괄호 사용   ex) (0,1,2,3)
    • 집합(Set) : 중괄호 사용   ex) {0,1,2,3}
    • 딕셔너리(Dictionary) : {key : value} 형식으로 사용   ex) {'이름':'홍길동', '지역':'Seoul'}

3.3 집합(Set)

  • 중괄호({})안에 값을 입력하며, 값을 원소라고 함
  • 집합 연산(교집합, 합집합, 차집합, 대칭 차집합) 사용 가능
  • 중복x (중복된 원소는 하나만 제외하고 모두 없어짐)
  • 원소의 순서는 의미가 없어 인덱싱 불가
# 집합 생성
se1 = {1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e'}
se1

{1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e'}

=> 문자열도 집합 생성 가능하고 혼합하여 사용 가능

 

3.3.1 집합 변환

- 문자열 → 집합

se2 = set('안녕하세요')
se2

{'안', '녕', '하', '세', '요'}

 

- range() → 집합

se3 = set(range(0, 11))
se3

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

 

- 리스트 → 집합

li1 = ['a', 'b', 'c', 'd', 'e', 'a', 'a', 'b']
se4 = set(li1)
se4

{'a', 'b', 'c', 'd', 'e'}

=> 집합으로 변환 시 중복 제거 됨

 

- 튜플 → 집합

tu1 = ('a', 'b', 'c', 'd', 'e', 'a', 'a', 'b')
se5 = set(tu1)
se5

{'a', 'b', 'c', 'd', 'e'}

=> 집합으로 변환 시 중복 제거 됨

 

** 중복 제거

# list(set()) 중복제거
li1 = ['a', 'b', 'c', 'd', 'e', 'a', 'a', 'b']
1i2 = list(set(li1))
print(1i2)

# tuple(set()) 중복제거
tu1 = ('a', 'b', 'c', 'd', 'e', 'a', 'a', 'b')
tu2 = tuple(set(tu1))
print(tu2)

['a', 'b', 'c', 'd', 'e']

('a', 'b', 'c', 'd', 'e')

=> 리스트/튜플 내 중복을 제거하기 위해 집합으로 변경 후 다시 리스트/튜플로 변경함

 

3.3.2 원소 확인 ( len(),  in )

se6 = {'a', 'b', 'c', 'd', 'e'}
se7 = {'a', 'b', 'c'}

# len() : 원소 개수
print(len(se6), len(se7)
# 특정원소 in 집합 : 집합내 특정원소 확인
print('a' in se6)

 

5 3

True 

=> 특정원소가 있으면 True, 없으면 False 출력

 

3.3.3 집합 연산 (합집합, 교집합, 차집합, 대칭 차집합)

밴다이어그램으로 집합연산 이해하기

  • 합집합(union)
A = {'강남','강서','동대문','관악','노원'}
B = {'동대문','관악','종로','구로'}

# 합집합 방법 2가지
u1 = A|B
u2 = A.union(B)
print(u1)
print(u2)

{'동대문', '종로', '노원', '구로', '강남', '강서', '관악'}

{'동대문', '종로', '노원', '구로', '강남', '강서', '관악'}

 

  • 교집합(intersection)
# 교집합 방법 2가지
i1 = A&B
i2 = A.intersection(B)
print(i1)
print(i2)

{'관악', '동대문'}
{'관악', '동대문'}

 

  • 차집합(difference)
# 차집합 방법 2가지
d1 = A - B
d2 = A.difference(B)
print(d1)
print(d2)

{'강서', '노원', '강남'}
{'강서', '노원', '강남'}

 

  • 대칭 차집합(symmetric_difference)
# 대칭 차집합 2가지 방법
s_d1 = A^B
s_d2 = A.symmetric_difference(B)
print(s_d1)
print(s_d2)

{'종로', '구로', '노원', '강남', '강서'}
{'종로', '구로', '노원', '강남', '강서'}

 

** 응용

- n1, n2 리스트 중복 없이 합쳐서 출력

n1 = [1, 2, 3, 4, 5, 6, 7]
n2 = [5, 6, 7, 8, 9, 10]

li1 = list(set(n1)|set(n2))
print(li1)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

- n1, n2 리스트 중복 요소만 출력

n1 = [1, 2, 3, 4, 5, 6, 7]
n2 = [5, 6, 7, 8, 9, 10]

li2 = list(set(n1)&set(n2))
print(li2)

[5, 6, 7]

 

3.3.3 집합 메소드  -  add(), update(), pop(), remove(), discard(), clear()

  • add() : 원소 추가   ( 리스트에서는 append() )
C = {'모니터','마우스','노트북','핸드폰'}

# add()
C.add('USB')
print(C)

{'마우스', '노트북', 'USB', '핸드폰', '모니터'}

=> 집합은 순서대로 들어가지 않음

 

  • update() : 여러 원소 추가 (변경하는 것이 아님)
C = {'모니터','마우스','노트북','핸드폰'}

# update()
C.update(['키보드','스피커'])
print(C)

{'키보드', '마우스', '노트북', '핸드폰', '모니터', '스피커'}

=> 키보드, 스피커 2개의 원소를 추가함

 

  • pop() : 무작위 원소 제거 ( 특정 요소가 아닌 램덤 )
C = {'모니터','마우스','노트북','핸드폰'}

# pop()
p1 = C.pop()
print(C)
print(p1)

{'노트북', '모니터', '핸드폰'}
마우스

 

  • remove() : 특정 원소 삭제
C = {'모니터','마우스','노트북','핸드폰'}

# remove()
C.remove('마우스')
print(C)

{'노트북', '모니터', '핸드폰'}

=> 없는 원소를 제거하면 오류 발생

# 위 코드에서 마우스를 제거한 상태
C.remove('마우스')
print(C)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_19408\1035702983.py in <module>
      1 # 위 코드에서 마우스를 제거한 상태
----> 2 C.remove('마우스')
      3 print(C)

KeyError: '마우스'

 

  • discard() : 특정 원소 삭제, 없으면 무시
# 위 코드에서 마우스를 제거한 상태
C.discard('마우스')
print(C)

{'노트북', '모니터', '핸드폰'}

=> 마우스가 없지만 오류가 발생하지 않고 집합 C 출력

 

  • clear() : 모든 원소 삭제
# 모든 원소삭제
C = {'모니터','마우스','노트북','핸드폰'}
print(C)

# clear()
C.clear()
print(C)

set()