점프 투 파이썬 DAY7(집합 자료형)

정지범·2026년 9월 16일

점프 투 파이썬

목록 보기
6/37

! 지금까지 리스트, 튜플, 딕셔너리 자료형에 대해서 알아보았다.

  • 이번에는 집합(set) 자료형에 대해서 알아보자.
  • 파이썬의 집합 자료형은 우리가 수학에서 배운 집합과 비슷한 개념이다.
  • 집합은 여러 개의 값을 저장할 수 있지만 다른 자료형과 달리 중복된 값을 허용하지 않는다.
  • 또한 요소의 순서가 정해져 있지 않다.
  • 이러한 특징 때문에 중복된 값을 제거하거나 교집합, 합집합, 차집합과 같은 집합 연산을 할 때 유용하게 사용할 수 있다.

1. 집합 자료형은 어떻게 만들까?

집합 자료형은 set() 함수를 사용해서 만들 수 있다.

>>> s1 = set([1, 2, 3])
>>> s1
{1, 2, 3}
  • set() 안에 리스트 [1, 2, 3]을 넣으면 집합 자료형으로 변환된다.
set(리스트)

문자열을 set()에 넣어 집합으로 만들 수도 있다.

>>> s2 = set("Hello")
>>> s2
{'H', 'e', 'l', 'o'}
  • 문자열 "Hello"의 각각의 문자가 집합의 요소가 된다.
  • 그런데 원래 "Hello"에는 l이 2개 있었지만 집합에서는 하나만 남아 있다.
  • 그 이유는 집합이 중복된 값을 허용하지 않기 때문이다.

집합은 순서가 없는 자료형이므로 실제 출력 순서는 위 예시와 다르게 나타날 수도 있다.


1-1. 중괄호로 집합 만들기

set() 함수를 사용하지 않고 중괄호 {}를 이용해서 직접 집합을 만들 수도 있다.

>>> s1 = {1, 2, 3}
>>> s1
{1, 2, 3}

  • 문자열도 집합의 요소로 사용할 수 있다.
>>> s2 = {'a', 'b', 'c'}
>>> s2
{'a', 'c', 'b'}
  • 입력한 순서가 a → b → c라고 해서 출력도 반드시 같은 순서로 나온다고 생각하면 안 된다.
  • 집합은 순서가 없는 자료형이기 때문이다.

1-2. 빈 집합 만들기

비어 있는 집합을 만들 때는 반드시 set()을 사용해야 한다.

>>> s = set()
>>> s
set()

그렇다면 다음처럼 {}를 사용하면 빈 집합이 될까?

>>> s = {}
>>> type(s)
<class 'dict'>
  • {}는 빈 집합이 아니라 빈 딕셔너리를 의미한다.

따라서 빈 집합과 빈 딕셔너리는 다음처럼 구분해야 한다.

set()    # 빈 집합
{}       # 빈 딕셔너리

! 빈 집합 주의

s = set()   # 집합 O
s = {}      # 집합 X, 딕셔너리 O



2. 집합 자료형의 특징

집합 자료형에는 매우 중요한 2가지 특징이 있다.

1. 중복을 허용하지 않는다.
2. 순서가 없다.

2-1. 중복을 허용하지 않는다

먼저 중복된 값이 들어 있는 리스트를 집합으로 변환해 보자.

>>> a = [1, 1, 2, 2, 3, 3]
>>> s = set(a)
>>> s
{1, 2, 3}
  • 원래 리스트에는 1, 2, 3이 각각 2개씩 들어 있었다.
  • 하지만 집합으로 변환하면 중복된 값이 모두 제거된다.
[1, 1, 2, 2, 3, 3]

        ↓ set()

{1, 2, 3}

따라서 집합은 데이터에서 중복된 값을 제거할 때 유용하게 사용할 수 있다.


2-1-1. 리스트의 중복 제거하기

예를 들어 다음과 같은 리스트가 있다고 해 보자.

>>> a = [1, 2, 2, 3, 3, 3, 4]
  • 집합으로 변환하면 중복된 값이 사라진다.
>>> set(a)
{1, 2, 3, 4}

  • 다시 리스트로 만들고 싶다면 list()를 사용하면 된다.
>>> a = list(set(a))
>>> a
[1, 2, 3, 4]

즉, 다음 형태를 이용하면 리스트의 중복 값을 쉽게 제거할 수 있다.

list(set(리스트))

단, 집합은 순서를 보장하지 않으므로 원래 리스트의 순서를 반드시 유지해야 하는 경우에는 이 방법을 주의해서 사용해야 한다.


2-2. 집합은 순서가 없다

리스트와 튜플은 요소마다 위치가 존재한다.

a = [10, 20, 30]
10 → index 0
20 → index 1
30 → index 2
  • 따라서 다음처럼 인덱싱할 수 있다.
>>> a[0]
10

하지만 집합은 순서가 없는 자료형이다.

>>> s = {10, 20, 30}
  • 집합의 각 요소에는 리스트처럼 고정된 인덱스 번호가 존재하지 않는다.
>>> s[0]
  • 위와 같이 사용하면 오류가 발생한다.
TypeError: 'set' object is not subscriptable

즉, 집합에서는 리스트처럼 s[0], s[1] 형태의 인덱싱을 사용할 수 없다.


2-3. 집합의 값을 인덱싱하고 싶다면?

집합의 요소를 꼭 인덱싱해야 한다면 리스트나 튜플로 변환한 후 사용해야 한다.

리스트로 변환

>>> s = {1, 2, 3}
>>> a = list(s)
>>> a
[1, 2, 3]

>>> a[0]
1

튜플로 변환

>>> s = {1, 2, 3}
>>> t = tuple(s)
>>> t
(1, 2, 3)
>>> t[0]
1

집합 자체에서는 인덱싱할 수 없지만 다음과 같이 다른 자료형으로 변환한 후에는 가능하다.

set → list  → 인덱싱 가능
set → tuple → 인덱싱 가능



3. 교집합, 합집합, 차집합 구하기

집합 자료형이 특히 유용하게 사용되는 부분이 바로 집합 연산이다.

  • 집합에서는 다음과 같은 연산을 쉽게 수행할 수 있다.
교집합
합집합
차집합

먼저 다음 2개의 집합을 만들어 보자.

>>> s1 = {1, 2, 3, 4, 5, 6}
>>> s2 = {4, 5, 6, 7, 8, 9}
  • 두 집합을 그림처럼 생각할 수 있다.
s1 = {1, 2, 3, 4, 5, 6}
s2 =          {4, 5, 6, 7, 8, 9}
               └─────┘
               공통 값

3-1. 교집합 구하기

교집합은 두 집합에 공통으로 존재하는 값을 의미한다.

s1 = {1, 2, 3, 4, 5, 6}
s2 = {4, 5, 6, 7, 8, 9}

교집합 = {4, 5, 6}

& 사용하기

파이썬에서는 & 연산자를 이용해서 교집합을 구할 수 있다.

>>> s1 & s2
{4, 5, 6}
  • s1과 s2 모두에 존재하는 4, 5, 6만 결과로 반환한다.
& = 교집합

intersection() 사용하기

intersection() 메서드를 사용할 수도 있다.

>>> s1.intersection(s2)
{4, 5, 6}

  • 반대로 실행해도 결과는 같다.
>>> s2.intersection(s1)
{4, 5, 6}

교집합을 구하는 2가지 방법

s1 & s2
s1.intersection(s2)

3-2. 합집합 구하기

합집합은 두 집합에 존재하는 모든 값을 하나로 합친 것이다.

s1 = {1, 2, 3, 4, 5, 6}
s2 = {4, 5, 6, 7, 8, 9}

합집합 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
  • 집합은 중복을 허용하지 않으므로 4, 5, 6은 한 번씩만 나타난다.

| 사용하기

파이프 문자 |를 사용하면 합집합을 구할 수 있다.

>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}
| = 합집합

union() 사용하기

union() 메서드를 사용해도 같은 결과를 얻을 수 있다.

>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

>>> s2.union(s1)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

합집합을 구하는 2가지 방법

s1 | s2
s1.union(s2)

3-3. 차집합 구하기

차집합은 한 집합에서 다른 집합과 겹치는 값을 제외한 것이다.


s1 - s2

>>> s1 - s2
{1, 2, 3}
  • s1에서 s2에도 존재하는 4, 5, 6을 제외한다.
  • 따라서 {1, 2, 3}이 남는다.
s1 - s2

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

= {1, 2, 3}

s2 - s1

>>> s2 - s1
{7, 8, 9}
  • 이번에는 s2를 기준으로 계산한다.
  • 따라서 s1에도 존재하는 4, 5, 6을 제외하고 7, 8, 9가 남는다.

차집합은 어느 집합에서 어느 집합을 빼는지에 따라 결과가 달라진다.

s1 - s2 ≠ s2 - s1

difference() 사용하기

difference() 메서드를 이용해서도 차집합을 구할 수 있다.

>>> s1.difference(s2)
{1, 2, 3}
>>> s2.difference(s1)
{7, 8, 9}

차집합을 구하는 2가지 방법

s1 - s2
s1.difference(s2)



4. 집합 연산 한눈에 보기

교집합, 합집합, 차집합을 한 번에 정리하면 다음과 같다.

연산기호메서드의미
교집합&intersection()두 집합에 공통으로 존재하는 값
합집합\|union()두 집합의 모든 값
차집합-difference()한 집합에서 다른 집합의 값을 제외

s1 = {1, 2, 3, 4, 5, 6}
s2 = {4, 5, 6, 7, 8, 9}
s1 & s2
# {4, 5, 6}
s1 | s2
# {1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 - s2
# {1, 2, 3}

! 간단하게 기억하기

  • & → 둘 다 있는 것 → 교집합
  • | → 둘을 합친 것 → 합집합
  • - → 상대 집합의 값을 뺀 것 → 차집합



5. 집합 자료형 관련 함수

이미 만들어진 집합에 새로운 값을 추가하거나 기존 값을 삭제할 수도 있다.

  • 집합에서 자주 사용하는 메서드는 다음과 같다.
add()
update()
remove()
discard()
clear()

5-1. 값 1개 추가하기 - add

add()는 집합에 값 하나를 추가할 때 사용한다.

>>> s = {1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

기본 형태는 다음과 같다.

집합.add(값)

  • 이미 존재하는 값을 추가하면 어떻게 될까?
>>> s = {1, 2, 3}
>>> s.add(2)
>>> s
{1, 2, 3}
  • 집합은 중복을 허용하지 않기 때문에 2가 하나 더 추가되지 않는다.
add() → 값 1개 추가

5-2. 값 여러 개 추가하기 - update

update()는 여러 개의 값을 한꺼번에 추가할 때 사용한다.

>>> s = {1, 2, 3}
>>> s.update([4, 5, 6])
>>> s
{1, 2, 3, 4, 5, 6}

기본 형태는 다음과 같다.

집합.update(여러_값)

add()와 update()의 차이를 비교해 보자.

add()    → 값 1개 추가
update() → 값 여러 개 추가

메서드용도
add()하나의 값 추가
update()여러 값 추가

예를 들어 4, 5, 6을 한꺼번에 추가하려면 update()가 편리하다.

>>> s.update([4, 5, 6])

5-2-1. update()에 문자열을 넣을 때 주의하기

문자열 역시 여러 개의 문자로 이루어진 반복 가능한 자료형이기 때문에 update()에 넣으면 각각의 문자가 추가된다.

>>> s = {'a'}
>>> s.update("bcd")
>>> s
{'a', 'b', 'c', 'd'}
  • "bcd"라는 문자열 하나가 통째로 추가되는 것이 아니다.
"bcd"

↓

'b'
'c'
'd'

문자열 자체를 하나의 요소로 추가하고 싶다면 add()를 사용한다.

>>> s = {'a'}
>>> s.add("bcd")
>>> s
{'a', 'bcd'}

5-3. 특정 값 제거하기 - remove

remove()는 집합에서 특정 값을 삭제할 때 사용한다.

>>> s = {1, 2, 3}
>>> s.remove(2)
>>> s
{1, 3}

기본 형태는 다음과 같다.

집합.remove(값)

  • 그런데 집합에 존재하지 않는 값을 삭제하려고 하면 어떻게 될까?
>>> s = {1, 2, 3}
>>> s.remove(4)
  • 오류가 발생한다.
KeyError: 4

즉, remove()는 삭제하려는 값이 반드시 집합에 존재해야 한다.


5-4. 특정 값 제거하기 - discard

discard() 역시 집합에서 특정 값을 삭제하는 메서드이다.

>>> s = {1, 2, 3}
>>> s.discard(2)
>>> s
{1, 3}
  • 여기까지는 remove()와 같다.

하지만 존재하지 않는 값을 삭제하면 차이가 나타난다.

>>> s = {1, 2, 3}
>>> s.discard(4)
>>> s
{1, 2, 3}
  • 오류가 발생하지 않는다.
  • 4가 없기 때문에 아무 작업도 하지 않고 넘어간다.

5-4-1. remove()와 discard()의 차이

두 메서드는 모두 값을 삭제하지만 존재하지 않는 값을 삭제했을 때의 동작이 다르다.

메서드값이 존재할 때값이 없을 때
remove(x)삭제오류 발생
discard(x)삭제아무 일도 일어나지 않음

s.remove(10)
10이 없으면 → KeyError 발생

s.discard(10)
10이 없어도 → 오류 없음

! remove와 discard 차이

remove()  → 없으면 오류
discard() → 없어도 오류 없음

5-5. 모든 값 제거하기 - clear

clear()는 집합 안에 들어 있는 모든 값을 삭제한다.

>>> s = {1, 2, 3}
>>> s.clear()
>>> s
set()
  • 모든 요소가 제거되어 빈 집합이 된다.

여기서 결과가 {}가 아니라 set()이라는 점을 기억하자.

set()    # 빈 집합
{}       # 빈 딕셔너리



6. 집합 관련 함수 한눈에 보기

지금까지 배운 집합 관련 메서드를 정리하면 다음과 같다.

사용법설명
s.add(x)값 1개 추가
s.update(x)값 여러 개 추가
s.remove(x)특정 값 삭제, 값이 없으면 오류
s.discard(x)특정 값 삭제, 값이 없어도 오류 없음
s.clear()모든 값 삭제

집합 연산까지 함께 정리하면 다음과 같다.

사용법설명
s1 & s2교집합
s1.intersection(s2)교집합
s1 \| s2합집합
s1.union(s2)합집합
s1 - s2차집합
s1.difference(s2)차집합



7. 리스트, 튜플, 딕셔너리, 집합 비교하기

지금까지 배운 여러 자료형을 한번 비교해 보자.

자료형표현순서중복값 변경
리스트[1, 2, 3]OOO
튜플(1, 2, 3)OOX
딕셔너리{'a': 1}입력 순서 유지Key 중복 XO
집합{1, 2, 3}XXO

각각의 핵심 특징만 간단하게 기억해 보자.

리스트
→ 순서 O
→ 중복 O
→ 수정 O

튜플
→ 순서 O
→ 중복 O
→ 수정 X

딕셔너리
→ Key : Value 형태

집합
→ 순서 X
→ 중복 X



8. 집합에서 기억해야 할 핵심

집합 자료형에서 가장 중요한 내용을 정리하면 다음과 같다.

  • 집합은 set() 또는 {}를 이용해서 만들 수 있다.
s1 = set([1, 2, 3])
s2 = {1, 2, 3}

  • 빈 집합은 반드시 set()을 사용한다.
s = set()
s = {}  # 빈 딕셔너리

  • 집합은 중복을 허용하지 않는다.
>>> set([1, 1, 2, 2, 3])
{1, 2, 3}

  • 집합에는 순서가 없다.
s[0]  # 오류

  • 인덱싱하려면 리스트나 튜플로 변환해야 한다.
list(s)
tuple(s)

  • & 또는 intersection()으로 교집합을 구할 수 있다.
s1 & s2

  • | 또는 union()으로 합집합을 구할 수 있다.
s1 | s2

  • - 또는 difference()로 차집합을 구할 수 있다.
s1 - s2

  • add()는 하나의 값을 추가한다.
s.add(4)

  • update()는 여러 값을 추가한다.
s.update([4, 5, 6])

  • remove()는 값을 삭제하지만 존재하지 않는 값을 지정하면 오류가 발생한다.
s.remove(2)

  • discard()는 값이 없어도 오류가 발생하지 않는다.
s.discard(2)

  • clear()는 모든 값을 삭제한다.
s.clear()

! 집합 자료형 핵심

집합을 처음 공부할 때 가장 먼저 기억해야 할 것은 딱 2가지이다.

1. 중복을 허용하지 않는다.
2. 순서가 없다.

따라서 다음과 같은 상황에서 집합을 유용하게 사용할 수 있다.

중복 제거 → set()

교집합 → &
합집합 → |
차집합 → -

특히 remove()와 discard()는 둘 다 값을 삭제하지만,

remove()  → 값이 없으면 오류
discard() → 값이 없어도 오류 없음

이라는 차이가 있다는 것도 같이 기억해 두자.

profile
성실하자:)

0개의 댓글