에이블스쿨 6기 DX 트랙/일일 복습

DAY 03. 집합 자료형

d061120 2024. 9. 6. 19:25

5. 집합 자료형

  • 집합 연산(교집합, 합집합, 차집합, 대칭 차집합)을 위한 자료형
  • 중복을 허용하지 않아 중복된 원소는 하나만 제외하고 모두 무시됨
  • 원소의 순서가 의미가 없으므로 인덱싱과 슬라이싱으로 값을 얻을 수 없음

5.1. 집합 만들기

5.1.1. 집합 직접 만들기

1) 정수를 갖는 집합

# 정수를 갖는 집합
nums = {1, 2, 3, 4, 5}

# 확인
nums
---
{1, 2, 3, 4, 5}

 

2) 문자열을 갖는 집합

# 문자열을 갖는 집합
members = {'홍길동', '일지매', '한사랑'}

# 확인
members
---
{'일지매', '한사랑', '홍길동'}

→ 출력을 통해 순서에 의미가 없음을 확인할 수 있다.

 

5.1.2. 집합으로 자료형 변환

  • set() 함수를 사용해 다른 자료형을 집합으로 변환

1) 문자열 → 집합

  • set() 함수로 개별 문자를 요소로 갖는 집합을 만들 수 있음
  • 같은 요소를 갖지 않는 집합의 특징에 따라 중복된 문자는 제거
# 문자열로 집합 만들기
hello = set('잘지내지요')

# 확인
hello
---
{'내', '요', '잘', '지'}

→ 문자열을 개별 요소를 가진 집합으로 변환 후 순서의 의미가 없어짐

 

2) 리스트 → 집합

  • 리스트가 집합으로 변환되면 중복된 요소는 제거됨
  • 튜플을 집합으로 변환해도 중복된 요소는 제거됨
# 리스트 만들기
member = ['홍길동', '한사랑', '홍길동', '일지매', '박여인']

# 집합 만들기
member1 = set(member)

# 확인
member1
---
{'박여인', '일지매', '한사랑', '홍길동'}

 

5.1.3. 집합 정보 확인

  • len() 함수로 집합에 포함된 원소 개수를 확인합니다.
  • in 연산자로 집합에 요소가 속해 있는지 확인합니다.

1) 원소 개수 확인

# 집합 만들기
member1 = {'홍길동', '한사랑', '일지매', '박여인'}
member2 = {'김치국', '안경태', '이리와'}

# 확인
print(len(member1), len(member2))
---
4 3

 

2) 원소 포함 여부 확인

# 집합 만들기
member1 = {'홍길동', '한사랑', '일지매', '박여인'}
member2 = {'김치국', '안경태', '이리와'}

# 확인
print('홍길동' in member1)
print('홍길동' in member2)
---
True
False
print({1, 2, 3} == {3, 2, 1})
print({1, 2, 3} == {3, 4, 1})
print(3 == {3, 2, 1})
print(3 in {3, 2, 1})
---
True
False
False
True

 

5.1.4. 집합 활용 #1

  • list() 함수를 사용해 튜플이나 집합을 리스트로 변환
  • tuple() 함수를 사용해 리스트나 집합을 튜플로 변환
  • set() 함수를 사용해 리스트나 튜플을 집합으로 변환

1) 리스트 중복 요소 제거 (튜플에서도 동일하게 활용 가능)

# 리스트 만들기
nums = [12, 45, 23, 21, 36, 28, 12, 36, 35, 28, 45, 63, 12, 21]

# 리스트 --> 집합 변환
nums = set(nums)

# 집합 --> 리스트 변환
nums = list(nums)
nums.sort()   # 이걸 추가하면 오름차순으로 정렬된 리스트로 만들 수 있음

#확인
nums
---
[12, 21, 23, 28, 35, 36, 45, 63]

 

5.2. 집합 연산

5.2.1. 교집합, 합집합, 차집합, 대칭 차집합

  • 교집합: A∩B
  • 합집합: A∪B
  • 차집합: A - B 또는 B - A (둘은 서로 다르다는 것에 주의!)
  • 대칭 차집합: A∪B - A∩B

1) 합집합

  • 합집합은 | 또는 union() 메서드를 사용
# 집합 만들기
member_set1 = {'홍길동', '한사랑', '일지매', '박여인'}
member_set2 = {'한사랑', '홍길민', '강우동'}

# 합집합 구하기 #1
member_set3 = member_set1 | member_set2
# 또는
# member_set3 = member_set1.union(member_set2)

# 확인
member_set3
---
{'강우동', '박여인', '일지매', '한사랑', '홍길동', '홍길민'}

 

2) 교집합

  • 교집합은 & 또는 intersection() 메서드를 사용
# 집합 만들기
member_set1 = {'홍길동', '한사랑', '일지매', '박여인'}
member_set2 = {'한사랑', '홍길민', '강우동'}

# 교집합 구하기 #1
member_set3 = member_set1 & member_set2
# 또는
# member_set3 = member_set1.intersection(member_set2)

# 확인
member_set3
---
{'한사랑'}

 

3) 차집합

  • 차집합은 - 또는 difference() 메서드를 사용
# 집합 만들기
member_set1 = {'홍길동', '한사랑', '일지매', '박여인'}
member_set2 = {'한사랑', '홍길민', '강우동'}

# 차집합 구하기 #1
member_set3 = member_set1 - member_set2
# 또는
# member_set3 = member_set1.difference(member_set2)

# 확인
member_set3
---
{'박여인', '일지매', '홍길동'}

 

4) 대칭 차집합

  • 대칭 차집합은 ^ 또는 symmetric_difference() 메서드를 사용해 구합니다.
# 집합 만들기
member_set1 = {'홍길동',  '한사랑', '일지매', '박여인'}
member_set2 = {'한사랑', '홍길민', '강우동'}

# 대칭 차집합 구하기 #1
member_set3 = member_set1 ^ member_set2
# 또는
# member_set3 = member_set1.symmetric_difference(member_set2)

# 확인
member_set3
---
{'강우동', '박여인', '일지매', '홍길동', '홍길민'}

 

5.2.2. 집합 활용 #2

1) 주어진 리스트에서 중복된 요소 제거하기

# 중복 요소를 갖는 리스트
nums = [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9]

# 중복 요소 제거
nums = list(set(nums))

# 확인
nums
---
[1, 2, 3, 4, 5, 6, 7, 8, 9]

→ 리스트를 집합으로 변환 후(이때 중복값이 제거됨) 리스트로 재변환

 

2) 주어진 두 리스트에서 중복된 요소를 뽑아 새로운 리스트를 만들기

# 리스트 만들기
num1 = [1, 2, 4, 6, 8, 9]
num2 = [2, 3, 4, 5, 7, 9]

# 중복 요소 찾기
num3 = list(set(num1) & set(num2))   # 교집합 사용
num3.sort()

# 확인
num3
---
[2, 4, 9]

→ 각 리스트를 집합으로 변환하여 교집합 연산 후 연산 결과를 리스트로 재변환(필요에 따라 정렬도 적용)

 

5.3. 집합 관련 메서드

1) 요소 하나 추가

  • 요소 하나를 추가할 때는 add() 메서드를 사용
  • 주의! 리스트는 add()가 아닌 append() 메서드를 사용
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 원소 하나 추가
member_set.add('강우동')

# 확인
member_set   # 리스트의 맨 뒤에 하나를 추가하던 append()와 다르게 순서에 관계없이 추가한다.
---
{'강우동', '박여인', '일지매', '한사랑', '홍길동'}

→ 리스트의 맨 뒤에 하나를 추가하던 append()와 다르게 순서에 관계없이 추가한다.

 

2) 여러 요소 추가

  • 여러 요소를 추가할 때는 update() 메서드를 사용
  • 주의! update() 메서드는 변경이 아닌 추가임을 기억할 것
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 여러 원소(리스트, 튜플, 딕셔너리) 추가
member_set.update(['한국인', '나도야'])   # update()안에는 리스트, 튜플, 집합 모두 넣을 수 있음. 단, 리스트를 사용하는게 보편적

# 확인
member_set
---
{'나도야', '박여인', '일지매', '한국인', '한사랑', '홍길동'}

→ update()안에는 리스트, 튜플, 집합 모두 넣을 수 있음. 단, 리스트를 사용하는게 보편적

 

3) 무작위 한 요소 삭제

  • 무작위로 요소 하나를 삭제할 때는 pop() 메서드를 사용
  • pop() 메서드는 삭제되는 요소를 반환하면서 삭제함
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 무작위로 원소 하나 삭제. 단, 커널을 재시작하면 결과가 달라질 수 있음.
del_member = member_set.pop()   # pop()은 반환하므로 

# 확인
print(member_set)
print(del_member)
---
{'한사랑', '박여인', '일지매'}
홍길동

→ 커널을 재시작후 실행하면 삭제 요소가 달라질 수 있음

 

4) 요소 삭제(없으면 오류)

  • 요소를 지정해서 삭제할 때는 remove() 메서드를 사용
  • 삭제하려는 요소가 없으면 오류 발생
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 원소 하나 삭제
member_set.remove('일지매')

# 확인
member_set
---
{'박여인', '한사랑', '홍길동'}
# 없는 원소를 삭제하면 오류 발생
member_set.remove('한국인')

# 확인
member_set
---
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[99], line 2
      1 # 없는 원소를 삭제하면 오류 발생
----> 2 member_set.remove('한국인')
      4 # 확인
      5 member_set

KeyError: '한국인'

 

5) 요소 삭제(없으면 무시)

  • 요소를 지정해서 하나 삭제할 때는 discard() 메서드를 사용
  • remove() 메서드와는 달리 삭제하려는 요소가 없어도 오류가 발생하지 않음
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 없는 원소를 삭제하면 무시
member_set.discard('홍길동')
member_set.discard('한국인')

# 확인
member_set
---
{'박여인', '일지매', '한사랑'}

 

6) 모든 원소 삭제

  • 모든 요소를 삭제할 때는 clear() 메서드를 사용
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 모든 원소 삭제
member_set.clear()

# 확인
print(member_set)
type(member_set)
---
set()
set

 

  • 주의! 아래와 같이 진행하면 자료형식이 딕셔너리로 바뀐다.
# 집합 만들기
member_set = {'홍길동', '한사랑', '일지매', '박여인'}

# 모든 원소 삭제
member_set = {}   # 주의: 이렇게 선언하면 자료형식이 딕셔너리로 바뀐다.

# 확인
print(member_set)
type(member_set)
---
{}
dict

 

'에이블스쿨 6기 DX 트랙 > 일일 복습' 카테고리의 다른 글

DAY 05. 함수  (1) 2024.09.12
DAY 04. 제어문  (0) 2024.09.11
DAY 03. 딕셔너리 자료형  (3) 2024.09.06
DAY 03. 튜플 자료형  (0) 2024.09.06
DAY 02. 리스트 자료형  (0) 2024.09.06