목차

Set
집합은 리스트와 다르게 중복을 허용하지 않고 순서도 없는 자료구조입니다.
고등학교 시절 확률과 통계 시간에 배운 그 집합의 개념과 동일합니다.
Set의 기본 구조는 다음과 같이 중괄호 '{ }'를 사용해서 표현합니다.
set_data={1,2,2,3,2,1,5,4,3}
print(type(set_data)) # 출력값: <class 'set'>
print(len(set_data)) # 출력값: 5
print(set_data) # 출력값: {1, 2, 3, 4, 5}
출력값을 보면 중복되는 값들이 없어진 것을 볼 수 있어요🧐
만약, 해당 리스트의 아이템들을 중복을 없애고 싶다면?
리스트를 집합으로 바꿔서 중복을 제거해주고, 다시 리스트로 반환해줄 수도 있겠죠?
data=[1,2,3,1,2,3,5] # 리스트
print(type(data), data) # 출력값: <class 'list'> [1, 2, 3, 1, 2, 3, 5]
set_data=set(data) # 집합
print(type(set_data), set_data) # 출력값: <class 'set'> {1, 2, 3, 5}
data_list=list(set_data) # 다시 리스트
print(type(data_list), data_list) # 출력값: <class 'list'> [1, 2, 3, 5]
코드에서 처럼 정리가 된 것을 볼 수 있어요.
집합 요소 추가
그렇다면, 집합에서는 요소를 어떻게 추가할 수 있을까요?
요소 추가 방식에는 2가지가 있는데요,
- add()
- update()
add는 1개의 요소를 추가할 때 사용할 수 있어요.
set_data={1,2,2,3,2,1,5,4,3}
set_data.add(100)
print(set_data) # 출력값: {1, 2, 3, 4, 5, 100}
set_data.add(1)
print(set_data) # 출력값: {1, 2, 3, 4, 5, 100}
set_data.add(1,2,3) # 출력값: TypeError: unhashable type: 'set'
set_data.add({1,2,3}) # 출력값: TypeError: unhashable type: 'set'
집합은 중복 요소를 허용하지 않기 때문에, 이미 있는 값을 추가를 한다 해도 변화는 없어요🙂
또한, 여러 요소들을 한꺼번에 넣으려고 한다면 Error가 발생하게 되요.
그럼 여러 개 요소들을 한번에 넣고 싶으면 어떻게 할까요?
바로 update() 를 사용하시면 됩니다!
set_data={'a2', 'a3', 'a1', 'a4'}
set_data.update({'test1', 'test2','test3'})
print(set_data) # 출력값: {'test2', 'a3', 'test3', 'test1', 'a1', 'a2', 'a4'}
출력값을 보고 처음에는 뒤에서부터 입력된 것인지, 왜 순서가 뒤죽박죽인지 당황했는데요,
집합(set)은 순서를 보장하지 않기 때문에 정렬된 형태로 출력되지 않으며, 실행할 때마다 결과의 순서가 달라질 수도 있습니다.
집합 요소 삭제
추가를 했으니 삭제하는 기능도 필요하죠.
요소를 삭제하는 메서드로는 다음 2가지가 있어요.
- remove()
- discard()
set_data={'a2', 'a3', 'a1', 'a4'}
set_data.remove('a1')
print(set_data) # 출력값: {'a4', 'a2', 'a3'}
set_data.discard('a2')
print(set_data) # 출력값: {'a4', 'a3'}
set_data.remove('hello') # Error
set_data.discard('hello') # Error X
remove와 discard는 모두 집합(set)에서 하나의 요소를 삭제할 때 사용하는 메서드입니다.
그렇다면 이 둘의 차이는 무엇일까요?
두 메서드 모두 존재하는 요소를 삭제할 때는 동일하게 동작합니다.
하지만 존재하지 않는 요소를 삭제하려고 할 때 차이가 발생는데요,
- remove()는 해당 요소가 없으면 에러가 발생합니다.
- discard()는 해당 요소가 없어도 에러 없이 그대로 넘어갑니다.
즉,
삭제하려는 요소의 존재 여부를 확인하고 싶다면 remove()를 사용하고,
요소가 있든 없든 에러 없이 처리하고 싶다면 discard()를 사용하는 것이 좋습니다.
집합 연산
이제는 두 집합 사이를 계산을 해봐야겠죠?
집합의 연산은 수학시간에 배운 연산과 동일하게 있습니다.
합집합, 교집합, 차집합!
먼저, 합집합은 union()을 사용해 연산을 할 수 있습니다.
set_data1={'a1','a2','a3'}
set_data2={'t1','t2','a1','a2'}
result1 = set_data1.union(set_data2) # 합집합
print('set_data1: ', set_data1) # 출력값: set_data1: {'a2', 'a1', 'a3'}
print('set_data2: ', set_data2) # 출력값: set_data2: {'a2', 't1', 't2', 'a1'}
print('result: ', result1) # 출력값: result: {'a2', 'a1', 't1', 't2', 'a3'}
result 출력값을 보면 set_data1과 set_data2가 합쳐져, 합집합이 만들어진 것을 확인할 수 있어요.
교집합은 두 집합의 공통되는 요소들만을 출력하려는 역할이죠.
연산자인 "&" 혹은 intersection() 메서드를 사용할 수 있어요.
# 교집합
set_data1={'a1','a2','a3'}
set_data2={'t1','t2','a1','a2'}
# 방법 1: 메서드
result2=set_data1.intersection(set_data2)
print('result2: ',result2) # 출력값: result2: {'a1', 'a2'}
# 방법 2: 연산자 "&"
result3 = set_data1 & set_data2
print('result3: ', result3) # 출력값: result3: {'a1', 'a2'}
연산자 방법과 메서드 방법 모두 같은 교집합의 결과를 출력하고 있다는 것을 확인할 수 있었어요.
다음은 차집합 인데요, 첫 번째 집합에만 있는 요소를 기대할 수 있어요.
연산자인 "-" 혹은 difference() 메서드를 활용할 수 있습니다.
# 차집합
set_data1={'a1','a2','a3'}
set_data2={'t1','t2','a1','a2'}
# 방법 1: 연산자 "-"
result4 = set_data1.difference(set_data2)
print('result4', result4) # 출력값: result4 {'a3'}
# 방법 2: 메서드
result4 = set_data1.difference(set_data2) # 차집합
print('result4', result4) # 출력값: result4 {'a3'}
두 방법 모두 set_data1에만 있는 요소가 출력되는 것을 확인할 수 있었습니다.
그렇다면 한 집합에만 있는 요소가 아니라,
두 집합 중 하나에만 존재하는 요소를 찾으려면 어떻게 해야 할까요?
이때 사용하는 개념이 대칭차집합이며,
연산자 "^" 혹은 symmetric_difference() 메서드를 활용할 수 있습니다.
# 대칭 차집합
set_data1={'a1','a2','a3'}
set_data2={'t1','t2','a1','a2'}
# 방법 1: 연산자 "^"
result5 = set_data1^set_data2
print('result5', result5) # 출력값: result5 {'t1', 't2', 'a3'}
# 방법 2: 메서드
result6 = set_data1.symmetric_difference(set_data2)
print('result6', result6) # 출력값: result6 {'t1', 't2', 'a3'}
이를 통해 set_data1에만 있는 'a3'와
set_data2에만 있는 't1', 't2'가 출력되는 것을 확인할 수 있었어요. 🙂
원본 집합 업데이트
지금까지는 집합 연산의 결과를 새로운 변수에 저장하는 방법으로만 했는데,
추가적으로 원본 집합 자체를 직접 변경하는 방법도 있습니다.
집합에서 사용하는 대부분의 연산은 원본을 업데이트하는 메서드 형태로 제공됩니다.
- 합집합 업데이트 → update()
- 교집합 업데이트 → intersection_update()
- 차집합 업데이트 → difference_update()
- 대칭차집합 업데이트 → symmetric_difference_update()
이 메서드들은 모두 기존 집합을 직접 수정한다는 공통점이 있으며,
사용 방식 또한 비슷하게 적용할 수 있습니다.
예를 들어, 차집합 업데이트를 확인해보면 다음과 같습니다.
set_data1={'a1','a2','a3'}
set_data2={'t1','t2','a1','a2'}
set_data1.difference_update(set_data2)
print(set_data1) # 출력값: {'a3'}
set_data1과 set_data2의 차집합을 새로운 변수에 저장하는 것이 아니라,
difference_update()를 사용하면 차집합 결과가 set_data1에 바로 반영된 것을 확인할 수 있었습니다.
집합의 개념과 메서드들을 정리하는 과정에서 대칭차집합과 원본 집합 업데이트까지 함께 이해할 수 있었습니다.
특히 이러한 집합의 활용이 결측치 처리와 같은 데이터 연산에도 도움이 될 것 같아,
앞으로 이어서 더 학습해보려고 합니다.☺️
'개발' 카테고리의 다른 글
| 파이썬: 반복문(for, while) (0) | 2026.04.09 |
|---|---|
| 파이썬: 조건문(if) (0) | 2026.04.06 |
| 파이썬: 딕셔너리(Dictionary) (0) | 2026.04.06 |
| 파이썬: 튜플(Tuple) (0) | 2026.04.04 |
| 파이썬: 리스트(List) (0) | 2026.04.04 |