[Python 입문 강좌 - 12] 파이썬 집합(Set) 정리 및 사용법

 

더보기

 

집합에 대해 자세히 알아보고 집합을 사용하는 방법에 대해 보도록 하겠습니다. 집합은 자료형의 하나로 단일 변수에 여러 항목을 저장합니다. 자료형(Data Type)이 무엇인지는 [Python 입문 강좌 -5]에서 알아봤습니다. 자료형에 대해 궁금하시면 링크를 통해 확인해주세요.

 


1. 파이썬 집합(Set) 이란?


Python 집합은 고유한 요소의 모음이다. 집합의 목적은 단일 변수에 여러 항목을 저장하는 것이다. 

집합의 특징은 다음과 같습니다.

  • 순서가 없다. (인덱스로 접근하지 못한다.)
  • 중복은 허용되지 않는다.
  • 요소는 변경 불가능한 자료형만 사용할 수 있다.

 

 

파이썬 집합 이미지

 

 


2. Python에서 집합 만들기

2.1 set() 함수 사용

 

집합을 만드는 첫 번째 방법은 set() 함수를 이용하는 방법이다. 이 함수는 변경 가능한 자료형(list, dictionary, string 등)을 집합으로 변환할 수 있습니다. 아래 코드는 리스트를 집합으로 변환하는 예시입니다.

 

>>> set_example = set([1, 2, 3, 4, 5])
>>> print(set_example)
{1, 2, 3, 4, 5}

 


2.2 집합에 직접 값 할당

 

변수에 값을 직접 할당하여 집합을 만들 수도 있습니다. 아래 코드는 정수를 집합으로 변환하는 예시입니다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> print(set_example)
{1, 2, 3, 4, 5}

 


3. 집합의 요소 접근

3.1 집합의 인덱싱

 

Python에서 집합은 순서가 지정되지 않습니다. 그래서 인덱스로 접근할 수 없습니다. 인덱스로 요소에 접근하려고 하면 TypeError가 발생합니다.

 


3.2 반복문을 이용한 집합 요소 접근

 

집합의 요소는 반복문을 이용하여 접근 할 수 있습니다. 아래 코드는 반복문을 이용해 집합의 모든 요소에 접근하는 예시입니다. 반복문은 추후 자세히 설명할 예정입니다.

 

>>> set_example = {1, 2, 3, 4,5}
>>> for i in set_example:
>>> 	print(i)

1
2
3
4
5

 


3.3 in 연산자를 이용한 요소 확인

 

집합에 특정 요소가 있는지 in연산자를 이용해서 확인 할 수 있습니다. 아래 코드는 집합에 각 요소가 있는지 확인하는 코드로 값이 있다면 True를 반환하고 없다면 False 값을 반환합니다.

 

>>> fruits = {"apple", "banana", "cherry"}
>>> print("apple" in fruits)
>>> print("grape" in fruits)
True
False

 


4. 집합에 요소 추가

4.1 add() 메서드 사용

 

add() 메서드는 집합에 단일 요소를 추가하는 데 사용할 수 있습니다. 아래 코드는 add() 메서드를 이용해 요소를 추가하는 예시이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.add(6)
>>> print(set_example)
{1, 2, 3, 4, 5, 6}

 


4.2 update() 메서드 사용

 

update() 메서드는 집합에 여러 요소를 추가하는 데 사용할 수 있습니다.  아래 코드는 update() 메서드를 이용해 리스트의 여러 요소를 집합에 추가하는 예시이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.update([6, 7, 8])
>>> print(set_example)
{1, 2, 3, 4, 5, 6, 7, 8}

 


5. 집합에서 요소 제거

5.1 remove() 메서드 사용

 

remove() 메서드는 집합에서 특정 요소를 제거하는 데 사용할 수 있습니다. 요소가 집합에 없으면 KeyError가 발생합니다. 아래 코드는 remove() 메서드를 이용해 요소를 제거하는 예시이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.remove(5)
>>> print(set_example)
{1, 2, 3, 4}

 


5.2 discard() 메서드 사용

 

discard() 메서드는 집합에서 특정 요소를 제거하는 데 사용할 수 있습니다. remove() 메소드와 달리, discard() 메소드는 요소가 세트에 존재하지 않는 경우 KeyError를 발생시키지 않습니다. 

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.discard(6)
>>> print(set_example)
{1, 2, 3, 4, 5}

 


5.3 pop() 메서드 사용

 

pop() 메서드는 집합에서 임의의 요소를 제거하는 데 사용할 수 있습니다. 아래 코드는 pop()코드를 이용해서 임의의 요소를 제거하는 예시이다. 이때 맨 앞에 있는 요소가 계속해서 제거되는 것을 확인 할 수 있다. 우리가 생각하기에 순서가 있는 것 처럼 제거된다고 느낄 수 있지만 집합은 순서가 없기에 임의의 요소가 제거되는 것이라고 말할 수 있다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.pop()
>>> print(set_example)
{2, 3, 4, 5}

 



6. 합집합, 교집합, 차집합, 대칭차집합

6.1 합집합

 

두 집합의 합집합은 두 집합의 모든 요소를 포함하는 집합입니다. 이는 union() 메서드 또는 `|` 연산자를 사용하여 수행할 수 있습니다. 아래 코드는 union()을 통해 두 집합을 합치는 코드이다. 이때 집합은 중복된 요소가 있을 수 없기 때문에 4, 5가 한 개씩 있는 것을 확인 할 수 있다.

 

파이썬 합집합 이미지

 

>>> set_a = {1, 2, 3, 4, 5}
>>> set_b = {4, 5, 6, 7, 8}
>>> set_c = set_a.union(set_b)
>>> print(set_c)
{1, 2, 3, 4, 5, 6, 7, 8}

>>> set_c = set_a | set_b
>>> print(set_c)
{1, 2, 3, 4, 5, 6, 7, 8}

 


6.2 교집합

 

두 집합의 교집합은 두 집합에 공통인 요소만 포함하는 집합입니다. 이는 Intersection() 메서드 또는 `&` 연산자를 사용하여 달성할 수 있습니다. 아래 코드는 Intersection()메서드를 통해 집합의 공통 요소를 찾는 코드이다. 

 

파이썬 교집합 이미지

 

>>> set_a = {1, 2, 3, 4, 5}
>>> set_b = {4, 5, 6, 7, 8}
>>> set_c = set_a.intersection(set_b)
>>> print(set_c)
{4, 5}

>>> set_c = set_a & set_b
>>> print(set_c)
{4, 5}

 


6.3. 차집합

 

두 집합의 차집합은 한 집합에는 있지만 다른 집합에는 없는 요소를 포함는 집합입니다. 이는 difference() 메소드 또는 `-` 연산자를 사용하여 달성할 수 있습니다. difference()는 교집합, 합집합과는 다르게 순서가 존재한다. 아래 코드는 difference() 메서드를 이용해서 없는 요소를 찾는 코드입니다. 

 

파이썬 차집합 이미지

 

>>> set_a = {1, 2, 3, 4, 5}
>>> set_b = {4, 5, 6, 7, 8}
>>> set_c = set_a.difference(set_b)
>>> print(set_c)
{1, 2, 3}

>>> set_c = set_a - set_b
>>> print(set_c)
{1, 2, 3}

 


6.4 대칭 차집합


두 집합의 대칭 차집합은 공통된 요소만 제외하고 모든 요소를 포함하는 집합입니다. 이는 symmetric_difference() 메서드 또는 `^` 연산자를 사용하여 달성할 수 있습니다. 아래 코드는 공통된 요소만 제외하고 찾는 코드입니다.

 

파이썬 대칭 차집합 이미지

 

>>> set_a = {1, 2, 3, 4, 5}
>>> set_b = {4, 5, 6, 7, 8}
>>> set_c = set_a.symmetric_difference(set_b)
>>> print(set_c)
{1, 2, 3, 6, 7, 8}

>>> set_c = set_a ^ set_b
>>> print(set_c)
{1, 2, 3, 6, 7, 8}

 


7. 집합의 기타 메서드

7.1 집합 요소의 수 세기

 

len() 메서드를 이용해 집합의 요소의 수를 찾을 수 있다. 아래 코드는 len()메서드를 이용해 집합의 요소의 수를 찾는 코드이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> print(len(set_example))
5

 


7.2 집합 모든 요소 제거

 

clear() 메서드는 집합에서 모든 요소를 제거하는 데 사용할 수 있다. 아래 코드는 clear()메서드를 이용해 집합의 모든 요소를 제거하는 코드이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_example.clear()
>>> print(set_example)
set()

 


7.3 집합

 

copy() 메서드는 집합의 얕은 복사본을 만드는 데 사용할 수 있습니다. 얕은 복사와 깊은 복사 링크를 통해 확인 할 수 있습니다. 아래 코드는 copy()메서드를 이용해 집합의 얕은 복사본을 만드는 코드이다.

 

>>> set_example = {1, 2, 3, 4, 5}
>>> set_copy = set_example.copy()
>>> print(set_copy)
{1, 2, 3, 4, 5}

 


8. set() vs frozenset()

 

set() 함수는 가변 집합을 생성하고 frozenset() 함수는 불변 집합을 생성합니다. 아래 코드는 set() 함수와 frozenset() 함수를 이용해서 가변 집합과 불변 집합을 생성하는 코드이다. frozenset()은 불변 집합이기 때문에 add() 메서드로 요소를 추가하려고 하면 AttributeError가 나타나는 것을 확인 할 수 있다.

 

set_example = set([1, 2, 3, 4, 5])
set_example.add(6)
print(set_example)
{1, 2, 3, 4, 5, 6}

frozenset_example = frozenset([1, 2, 3, 4, 5])
frozenset_example.add(6)
AttributeError: 'frozenset' object has no attribute 'add'