Python/Python 시작하기

11. 파이썬 자료형 - 집합 (set)

arvigoes 2019. 12. 17. 01:29

집합(set)                                                            

수학 에서 집합

 명확한 기준에 의하여 주어진 서로 다른 대상들이 모여 이루는 새로운 대상이다.
 어떤 대상이 집합에 속하는지 여부는 명확해야 하며, 집합 위에는 순서나 연산 따위의 구조가 주어지지 않는다.

파이썬에서의 집합도 이와 유사합니다., 순서가 없고 서로 다른 (unique) 한 값을 가집니다.

그런데 명확한 기준은 없습니다. 만드는 사람이 기준입니다.

dict 에서 key 와 비슷하게 각 요소에 대한 변경이 이뤄 질 수 있는 list나 set dict 등은 사용이 불가능 합니다.

이런것들을 가변 객체(mutable) 이라 부르고 이와 반대되는 개념의 불변형 객체(immutable) 이 있습니다.

이건 다음에 한번 다루도록 하겠습니다. 

 

집합 만들기                                                       

# Code 1
# set

set_test = {1,2,3, '한글'}
set_test2 = {}
set_test3 = set()
print(type(set_test))
print(type(set_test2))
print(type(set_test3))

list_str = ["나는 ", "사과를 ", "먹었다"]
set_list = set(list_str)
set_str = set(list_str[2])
print(type(set_list))
print(type(set_str))
print(set_list)
print(set_str)

11-1. set 생성

set_test2 = {} 는 타입이 dict 입니다.

dict 자료형이 먼저 만들어지고 set 이 만들어져서 중괄호({}) 생성은 dict 가 우선인가 봅니다. 

그러므로 비어 있는 set 타입 객체를 만드려면 set_test3 처럼 set() 으로 초기화 해 주도록 합시다.

 

리스트로도 초기화 가능 합니다.

스트링 형으로 set 을 만들 수 있습니다.

그런데 스트링형으로 만들어 보니 각 글자가 다 나눠져서 하나의 스트링이 됩니다.

 

그리고 마지막 예제에서 보시면 순서가 엉망입니다. 

set의 특징 순서가 없다 인데 어던게 먼저 나올지는 알 수 없습니다.(정상입니다)

 

요소 관리                                                          

요소 확인 in

# Code 2
# set

set_test = {1,2,3, '한글'}
print(2 in set_test)

11-2. set in

in 키워드를 통해 요소 확인이 가능 합니다.

 

원소 추가가는 add , update 메소드 ( 메소드에 대한 설명은 나중에 진행될 예정입니다.) 를 통해서만 가능 합니다.

# Code 3
# add update

set_test = {1,2,3, '한글'}
set_test.add(4)
print(set_test)
set_test.update("파이썬")
print(set_test)

11-3. 요소 추가

이외에 + 나 * 기는 지원 하지 않습니다.

# Code 4
# update 중복제거

set_test = {1,2,3,4, '한글'}
set_test.update([3,4,5])
print(set_test)

11-4. 중복제거

set의 특성상 자동으로 중복(3,4) 이 제거 됩니다.

 

원소의 제거는 remove, discard메소드 를 통해서만 가능 합니다.

# Code 5
# 요소제거

set_test = {1,2,3,4, '한글'}
set_test.remove(3)
print(set_test)
set_test.discard(4)
print(set_test)

11-5. 요소 제거

remove 와 discard는 동일하게 제거 하는 메소드 입니다.

차이점은 remove 는 없는 요소를 제거 하려 할때 error 가 발생 해서 프로그램이 멈추게 되지만

discard 는 에러 없이 수행이 됩니다. 에러가 없으면 좋은게 아니냐 라고 생각 할 수도 있지만 용도가 다른 거라 생각 하시면 될 거 같습니다.

 

집합 연산 지원                                                   

set을 정말 유용하게 사용하게 만드는 집합 연산 입니다.

교집합 차집합 합집합 이 정말 자주 사용되고 편리한 기능입니다.

  • | - 합집합 연산자
  • & : 교집합 연산자
  • - : 차집합 연산자
  • ^ : 대칭차집합 연산자(합집합 - 교집합)
  • |=, &=, -=, ^= : = 과 조합함으로써 연산과 동시에 할당
# Code 6
# 집합 연산

set_testA = {1,2,3,4}
set_testB = {1,2,7,8}
set_Hap = set_testA | set_testB     # 합집합
set_Gyo = set_testA & set_testB     # 교집합
set_Cha = set_testA - set_testB     # 차집합
set_Dae = set_testA ^ set_testB     # 대칭 집삽
print(set_Hap)
print(set_Gyo)
print(set_Cha)
print(set_Dae)
set_testA |= set_testB              # 합집합 할당
print(set_testA)

11-5. 집합연산

실제로는 메소드를 이용한 방법이 코드가 더 명확해 보여 자주 사용하게 됩니다.

메소드를 이용한 방법입니다.

# Code 7
# 집합 연산 메소드

set_testA = {1,2,3,4}
set_testB = {1,2,7,8}
set_Hap = set_testA.union(set_testB)            # 합집합
set_Gyo = set_testA.intersection(set_testB)     # 교집합
set_Cha = set_testA.difference(set_testB)       # 차집합
set_Dae = set_testA.symmetric_difference (set_testB)     # 대칭 집삽
print(set_Hap)
print(set_Gyo)
print(set_Cha)
print(set_Dae)

11-6. 메소드 연산

집합(set)에 대한 주요한 기능 및 메소드에 대해 알아 보았습니다.

본문내용 이외에도 여러 메소드들도 있는데 나중에 심화 학습으로 다뤄 보도록 하겠습니다.