! 지금까지 리스트, 튜플, 딕셔너리 자료형에 대해서 알아보았다.
집합 자료형은
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개 있었지만 집합에서는 하나만 남아 있다.집합은 순서가 없는 자료형이므로 실제 출력 순서는 위 예시와 다르게 나타날 수도 있다.
set()함수를 사용하지 않고 중괄호{}를 이용해서 직접 집합을 만들 수도 있다.
>>> s1 = {1, 2, 3}
>>> s1
{1, 2, 3}
>>> s2 = {'a', 'b', 'c'}
>>> s2
{'a', 'c', 'b'}
a → b → c라고 해서 출력도 반드시 같은 순서로 나온다고 생각하면 안 된다.비어 있는 집합을 만들 때는 반드시
set()을 사용해야 한다.
>>> s = set()
>>> s
set()
그렇다면 다음처럼
{}를 사용하면 빈 집합이 될까?
>>> s = {}
>>> type(s)
<class 'dict'>
{}는 빈 집합이 아니라 빈 딕셔너리를 의미한다.따라서 빈 집합과 빈 딕셔너리는 다음처럼 구분해야 한다.
set() # 빈 집합
{} # 빈 딕셔너리
! 빈 집합 주의
s = set() # 집합 O s = {} # 집합 X, 딕셔너리 O
집합 자료형에는 매우 중요한 2가지 특징이 있다.
1. 중복을 허용하지 않는다.
2. 순서가 없다.
먼저 중복된 값이 들어 있는 리스트를 집합으로 변환해 보자.
>>> 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}
따라서 집합은 데이터에서 중복된 값을 제거할 때 유용하게 사용할 수 있다.
예를 들어 다음과 같은 리스트가 있다고 해 보자.
>>> 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(리스트))
단, 집합은 순서를 보장하지 않으므로 원래 리스트의 순서를 반드시 유지해야 하는 경우에는 이 방법을 주의해서 사용해야 한다.
리스트와 튜플은 요소마다 위치가 존재한다.
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]형태의 인덱싱을 사용할 수 없다.
집합의 요소를 꼭 인덱싱해야 한다면 리스트나 튜플로 변환한 후 사용해야 한다.
>>> 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 → 인덱싱 가능
집합 자료형이 특히 유용하게 사용되는 부분이 바로 집합 연산이다.
교집합
합집합
차집합
먼저 다음 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}
└─────┘
공통 값
교집합은 두 집합에 공통으로 존재하는 값을 의미한다.
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()메서드를 사용할 수도 있다.
>>> s1.intersection(s2)
{4, 5, 6}
>>> s2.intersection(s1)
{4, 5, 6}
교집합을 구하는 2가지 방법
s1 & s2
s1.intersection(s2)
합집합은 두 집합에 존재하는 모든 값을 하나로 합친 것이다.
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()메서드를 사용해도 같은 결과를 얻을 수 있다.
>>> 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)
차집합은 한 집합에서 다른 집합과 겹치는 값을 제외한 것이다.
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()메서드를 이용해서도 차집합을 구할 수 있다.
>>> s1.difference(s2)
{1, 2, 3}
>>> s2.difference(s1)
{7, 8, 9}
차집합을 구하는 2가지 방법
s1 - s2
s1.difference(s2)
교집합, 합집합, 차집합을 한 번에 정리하면 다음과 같다.
| 연산 | 기호 | 메서드 | 의미 |
|---|---|---|---|
| 교집합 | & | 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}
! 간단하게 기억하기
&→ 둘 다 있는 것 → 교집합|→ 둘을 합친 것 → 합집합-→ 상대 집합의 값을 뺀 것 → 차집합
이미 만들어진 집합에 새로운 값을 추가하거나 기존 값을 삭제할 수도 있다.
add()
update()
remove()
discard()
clear()
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개 추가
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])
문자열 역시 여러 개의 문자로 이루어진 반복 가능한 자료형이기 때문에
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'}
remove()는 집합에서 특정 값을 삭제할 때 사용한다.
>>> s = {1, 2, 3}
>>> s.remove(2)
>>> s
{1, 3}
기본 형태는 다음과 같다.
집합.remove(값)
>>> s = {1, 2, 3}
>>> s.remove(4)
KeyError: 4
즉,
remove()는 삭제하려는 값이 반드시 집합에 존재해야 한다.
discard()역시 집합에서 특정 값을 삭제하는 메서드이다.
>>> s = {1, 2, 3}
>>> s.discard(2)
>>> s
{1, 3}
remove()와 같다.하지만 존재하지 않는 값을 삭제하면 차이가 나타난다.
>>> s = {1, 2, 3}
>>> s.discard(4)
>>> s
{1, 2, 3}
4가 없기 때문에 아무 작업도 하지 않고 넘어간다.두 메서드는 모두 값을 삭제하지만 존재하지 않는 값을 삭제했을 때의 동작이 다르다.
| 메서드 | 값이 존재할 때 | 값이 없을 때 |
|---|---|---|
remove(x) | 삭제 | 오류 발생 |
discard(x) | 삭제 | 아무 일도 일어나지 않음 |
s.remove(10)
10이 없으면 → KeyError 발생
s.discard(10)
10이 없어도 → 오류 없음
! remove와 discard 차이
remove() → 없으면 오류 discard() → 없어도 오류 없음
clear()는 집합 안에 들어 있는 모든 값을 삭제한다.
>>> s = {1, 2, 3}
>>> s.clear()
>>> s
set()
여기서 결과가
{}가 아니라set()이라는 점을 기억하자.
set() # 빈 집합
{} # 빈 딕셔너리
지금까지 배운 집합 관련 메서드를 정리하면 다음과 같다.
| 사용법 | 설명 |
|---|---|
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) | 차집합 |
지금까지 배운 여러 자료형을 한번 비교해 보자.
| 자료형 | 표현 | 순서 | 중복 | 값 변경 |
|---|---|---|---|---|
| 리스트 | [1, 2, 3] | O | O | O |
| 튜플 | (1, 2, 3) | O | O | X |
| 딕셔너리 | {'a': 1} | 입력 순서 유지 | Key 중복 X | O |
| 집합 | {1, 2, 3} | X | X | O |
각각의 핵심 특징만 간단하게 기억해 보자.
리스트
→ 순서 O
→ 중복 O
→ 수정 O
튜플
→ 순서 O
→ 중복 O
→ 수정 X
딕셔너리
→ Key : Value 형태
집합
→ 순서 X
→ 중복 X
집합 자료형에서 가장 중요한 내용을 정리하면 다음과 같다.
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() → 값이 없어도 오류 없음이라는 차이가 있다는 것도 같이 기억해 두자.