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 |