Chapter3

중고등학생을 위한 머신러닝

Chapter 3 : 집합(Set)의 연산

이전까지 배웠던 내용은 집합과 출력하는 함수 print를 배웠어요. 집합은 수학의 기본이고, print는 프로그래밍의 기초이기 때문에 Chapter 1,2에 집합과 print를 배웠죠. 그런데 오늘은 엄밀하게 집합을 공부하고자 해요.

In [1]:
a=[1,2,3,4]
a
Out[1]:
[1, 2, 3, 4]
a라는 집합에는 수가 1,2,3,4가 있습니다. 저번 위와 같이 표현하면 1,2,3,4를 원소로 한 집합이라고 설명했었죠. 그런데 만약 1이 두개라면 어떻게 될까요?
In [2]:
a.append(1)
a
Out[2]:
[1, 2, 3, 4, 1]
append라는 말은 영어로 추가하다에요. a라는 집합에 1을 추가하였으니 1이 추가된다고 생각할 수 있죠. 하지만 엄밀한 의미에서 집합은 a라는 집합에 원소는 1,2,3,4밖에 없어요. 아래 그림을 통해 이해해보죠

title

한 반에 남학생과 여학생이 30명이 있다고 하면 우리는 한 반의 성별(집합)에 남학생과 여학생이 몇 명씩 있다고 말해요. 그러나 성별이 무엇이 있냐고만 묻는다면, 우리는 남자와 여자가 있다고 말을 하죠.(뒤에 남학생/여학생 몇 명이 있는 지 배우니 걱정마세요 ㅎㅎ)

파이썬에서는 이러한 정보를 추가적으로 활용하기 위해 List와 집합(set)을 구분하고자 하죠 (List의 활용은 뒤에서 더 심도있게 공부할게요. 일단, a=[1,2,3,4]와 a.append(1)을 잊지 마세요!)

In [3]:
set1=set(a)
set1
Out[3]:
{1, 2, 3, 4}
{}가 있는 거 보이시죠? 사실 이 표기가 엄밀한 집합을 나타내는 기호에요. []는 List를 나타내기 위한 표기죠. 영어로 set은 집합을 의미하는데, 파이썬에서는 엄밀한 집합을 구분하기 위하여 set이라는 함수를 만들었죠.
In [4]:
set1.add(1)
set1
Out[4]:
{1, 2, 3, 4}
집합에서는 원소를 추가하고자 할 때 .add를 사용하는데, 1을 추가하였는데도 원소가 변함이 없는거 보이죠? 한 반에 남학생과 여학생이 몇 명있든 성별이라는 집합에는 영향이 미치지 않는 것과 같은 방식이죠.
In [5]:
set1.add(5)
set1
Out[5]:
{1, 2, 3, 4, 5}
반면, 5를 추가하였을 때는 5라는 원소가 추가된 것을 알 수 있죠.

Q1: range를 활용하여 1부터 10까지의 집합(set)을 만들어 보세요

In [ ]:
 
In [6]:
%%html
<img src="http://cfile24.uf.tistory.com/image/22138E3556434ACF171246" width=400 height=400>
집합에는 중요한 연산들이 있어요. 합집합, 교집합, 차집합 이 세가지죠. a={1,2,3,4} 와 b={3,4,5,6}을 예로 들어볼까요?합집합은 두 집합(k>=2)에 있는 모든 원소들을 갖고 있는 집합을 이야기해요. 말이 너무 어렵죠? 그림과 코드를 같이 보면서 공부해볼게요! 합(Union)을 한번 쳐보죠!
In [7]:
a=set([1,2,3,4])
b=set([3,4,5,6])
a.union(b)
Out[7]:
{1, 2, 3, 4, 5, 6}
1,2,3,4,5,6라고 나오네요? 비록 a에는 5,6이 없지만 합집합은 두 집합에 있는 모든 원소들을 갖고 있는 집합을 이야기하니 그림에서처럼 a.union(b)를 활용하는거죠!

Union

그럼 교집합은? 교집합은 두 집합 모두가 갖고 있는 원소들이 있는 집합을 의미해요. 말이 너무 어려우니, 그림과 코드를 같이 볼게요.

intersection

In [8]:
a.intersection(b)
Out[8]:
{3, 4}
영어로 intersection은 교차를 의미해요. 교차? 남자 한 명과 숙녀 한 분이 걸어가다 만다면 두 사람이 만나는 자리는 두 사람 모두 있는 자리죠? 이 자리를 두 사람이 교차하는 자리라고 해요. 흠...말은 너무 어렵지만 그림에 값을 같이 보면서 생각하면 쉬워요!

subtract

In [9]:
a-b
Out[9]:
{1, 2}
오잉? 달랑 빼기 하나?? 여태 어려운 영어들 다 써갔는데 -하나가 왠열..ㅎㅎ 그럼 여기서 알 수 있는 게 하나!! 차집합은 a라는 집합에서 a,b의 교집합만 뺀다는 사실!!(이해 안 가도 괜찮아요)

Q2: Q1에서 구한 집합 a와 range를 이용한 5~25의 집합 b의 합집합, 교집합, 차집합을 구해보세요

In [ ]:
 
Q3: 집합의 연산에서 exclusive라고 적혀있는 집합을 구하려면 어떻게 해야 할까요?(안 풀어도 상관없어요)
In [ ]:
 
In [13]:
# Q1 Answer:
set1=set(range(1,11))
print set1
# Q2 Answer:
set2=set(range(5,26))
print set1.union(set2)
print set1.intersection(set2)
print set1-set2
# Q3 Answer:
print set1.union(set2)-set1.intersection(set2)
# or
print (set1-set2).union(set2-set1)
set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25])
set([5, 6, 7, 8, 9, 10])
set([1, 2, 3, 4])
set([1, 2, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25])
set([1, 2, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25])
In [ ]: