본문 바로가기

파이썬 프로그래밍/파이썬 심화

[Python] Set. 예제를 통한 집합 기초 개념잡기

들어가기 전에.

파이썬에서는 자료형을 시퀀스데이터와 시퀀스 데이터가 아닌것으로 나눌 수 있습니다.
시퀀스: 순서를 정하는것
즉. 순서를 정하는 것과 순서를 정하지 않는 것으로 나눌 수 있다는 말입니다.

대표적인 시퀀스 데이터(순서를 정함)

- String, list, tuple

시퀀스가 아닌 데이터(순서와 관련이 없음)

- Set, dictionary



Set(집합)

집합의 정의: 서로가 구별되는 대상들을 순서와 무관하게 모은것.
집합의 성질: 중복을 허락하지 않는다. 


집합의 영어표기

집합: Set
합집합: union
차집합: diffrenece
교집합: intersection
대칭차집합: Symmetric difference
A와 B가 있을때 A,B의 대칭 차집합을 구하라 한다면, 교집합만 빼고 출력한다고 보면 됩니다.
즉 A,B가 공통되지 않은 모든것

집합안에 있는 숫자들을 원소 라고 하는데 원소는 element라고 합니다.



예제를 통해 이해하기


합집합

사용: | or union

코드

1
2
3
4
5
6
SetType1 = {1,2,3,4}
SetType2 = {5,6,7,8}
 
UnionSet = SetType1.union(SetType2)
print(UnionSet)
print(type(UnionSet))

cs


실행


실험

1
2
3
4
5
SetType1 = {1,2,3,4}
SetType2 = {5,6,7,8}
 
UnionSet = SetType1.union(SetType2)
print(UnionSet[1])
cs

list처럼 1의 주소를 출력해 본다면?


실행

에러가 납니다. 이것으로 Set(집합)은 시퀀스 타입이 아닌것을 확인해 볼 수 있습니다.

이것을 고급지게 말하면, Set타입은 인덱싱을 지원하지 않는 타입이라고 합니다.


교집합

사용: & or intersection

코드1
1
2
3
4
5
6
SetType1 = {1,2,3,4}
SetType2 = {3,4,5,6,7,8}
 
UnionSet = SetType1&SetType2
print(UnionSet)
print(type(UnionSet))
cs

코드2
1
2
3
4
5
6
SetType1 = {1,2,3,4}
SetType2 = {3,4,5,6,7,8}
 
UnionSet = SetType1.intersection(SetType2)
print(UnionSet)
print(type(UnionSet))
cs

실행



차집합

사용: - or difference

코드
1
2
3
4
5
6
SetType1 = {1,2,3,4}
SetType2 = {3,4,5,6,7,8}
 
Difference = SetType1.difference(SetType2)
print(Difference)
print(type(Difference))
cs

실행




집합이 얼마나 편리한 기능인지 알 수 있고, list사용법을 익히는 문제입니다.


문제)

리스트 두개를 만들고, 리스트-리스트 해서 차집합처럼 만들어보시오.

(set을 사용하면 안됨!)


코드

1
2
3
4
5
6
7
8
9
= [1,2,3,4]
= [4,5,6,7]
= []
 
for element in A:
    if element not in B:
        C.append(element)
 
print(C)
cs

실행


문제)

리스트를 두개 만들고 교집합을 출력하시오. (set을 사용하면 안됨!)


코드

1
2
3
4
5
6
7
8
9
= [1,2,3,4]
= [4,5,6,7]
= []
 
for element in A:
    if element not in B:
        C.append(element)
 
print(C)
cs


실행


여집합

A의 여집합이라 하면 합집합에서 A를 뺀 나머지

사용: difference


코드1)

1
2
3
4
5
6
7
Union = {1,2,3,4,5}
= {1,2}
AC = {}
 
AC = Union.difference(A)
 
print(AC)
cs


실행)



코드2) difference를 사용하지 않고 구해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
Union = [1,2,3,4,5]
= [1,2]
AC = []
for element_1 in Union:
    if element_1 not in A:#[1,2] 3,4,5참 // #1,2 거짓
        CG = 1
    else:
        CG = 0
 
    if CG == 1:
        AC.append(element_1)
 
print(AC)
cs


실행)



대칭 차집합

사용: A^B
교집합만 빼고 출력

코드)

1
2
3
4
5
6
7
= {1,2,3,4}
= {3,4,5,6}
 
result = A^B
 
print(result)
print(type(result))
cs

실행)


Set의 중복데이터를 추가하면?

1
2
3
4
5
6
7
8
List = [1,2,3]
List.append(3)
 
Set = {1,2,3}
Set.add(3)
 
print(List)
print(Set)
cs
list는 append로 추가를 할 수 있고,

Set은 add로 추가할 수 있습니다.

하지만 집합의 성질상 중복된 원소(element)는 추가 할 수 없기 때문에 추가가 되지 않습니다.


실행

Set의 삭제

1
2
3
4
5
6
Set = {1,2,3,4}
Set.add(5)
print('Add한 값: {}'.format(Set))
 
Set.remove(1)
print('Remove한 값: {}'.format(Set))
cs

실행

만약에 없는 값을 remove한다면 에러납니다.