Python/개념 및 정리

파이썬 set자료형

코딩하는 친구 2023. 4. 22. 22:51

집합 자료형 set

집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형


집합 자료형

#빈 집합 자료형 선언
>>>s = set()

# 원소가 있는 집합 자료형 선언
>>>s1 = set([1, 2, 3])
>>>s2 = set({1, 2, 3})
>>>s3 = {1, 2, 3}
모두 같은 집합을 만든다.

#집합 자료형 연산
>>>s1 = set([1, 2, 3, 4, 5])
>>>s2 = set([3, 4, 5, 6, 7])
>>>print(s1 & s2) # 교집합
{3, 4, 5}
>>>print(s1 | s2) # 합집합
{1, 2, 3, 4, 5, 6, 7}
>>>print(s1 - s2) # 차집합
{1, 2}

#set()괄호 안에 문자열 입력
>>>s2 = set("Hello")
>>>s2
{'e', 'H', 'l', 'o'}

집합 자료형의 특징

위에서 살펴본 set('Hello")를 set자료형으로 만들면 'l' 문자가 하나 빠져있고 순서도 뒤죽박죽이다. 그 이유는 set에 다음과 같은 2가지 특징이 있다.

  • 중복을 허용하지 않는다.
  • 순서가 없다
중복을 허용하지 않는 특징 때문에 set은 중복을 제거하기 위한 필터로 종종 사용된다

set자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.

>>>s1 = set([1, 2, 3])
>>>l1 = list(s1)
>>>l1
[1, 2, 3]
>>>l1[0]
1
>>>t1 = tuple(s1)
>>>t1
(1, 2, 3)
>>>t1[0]
1

집합 자료형 관련 함수들

  • 값 1개 추가하기(add)

이미 만들어진 set자료형에 값을 추가할 수 있다.

1개의 값만 추가(add)할 경우에는 다음과 같이 한다.

>>>s1 = set([1, 2, 3])
>>>s1.add(4)
>>>s1
{1, 2, 3, 4}
  • 값 여러 개 추가하기(update)

새로운 값을 여러 개 추가(update)할 경우에는 다음과 같이 한다.

>>>s1 = set([1, 2, 3])
>>>s1.update([4, 5, 6])
>>>s1
{1, 2, 3, 4, 5, 6}
  • 특정 값 제거하기(remove, discard)

set자료형에서 특정 값을 제거할 때는 다음과 같이 한다.

>>>s1 = set([1, 2, 3])
>>>s1.remove(2)
>>>s1
{1, 3}
>>>s1.discard(2)
>>>s1
{1, 3}
  • 임의의 원소를 제거하고 반환하기(pop)

set은 순서가 없으므로 임의의 값을 제거하고 반환하다.

set이 비어있으면 KeyError가 발생한다.

>>>s1 = set([1, 2, 3])
>>>s1.pop()
1
>>>s1
{2, 3}
  • 모든 원소 제거하기(clear)

set의 모든 원소를 제거한다.

>>>s1 = set([1, 2, 3])
>>>s1.clear()
>>>s1
set()
  • 특정 값이 set에 포함되어 있는지 확인하기(in)

해당 값이 set에 포함되어 있으면 True, 그렇지 않으면 False를 반환한다.

>>>s1 = set([1, 2, 3])
>>>print(2 in s1)
True
>>>print(4 in s1)
False
  • set의 길이 구하기(len)

set의 길이를 반환하다.

>>>s1 = set([1, 2, 3])
>>>print(len(s1))
3

set자료형- 자료구조

파이썬 set자료형은 내부적으로 해시 테이블(Hash Table)을 사용하여 구현되어 있다.

해시 테이블은 값에 대한 인덱스를 계산하고 값을 저장하므로, 값을 찾는 데 걸리는 시간이 상수 시간에 가깝다. O(1).

 

반면에 리스트는 인덱스를 찾는 데에는 상수 시간이 걸리지만, 값이 있는지를 찾기 위해서는 리스트의 모든 요소를 반복적으로 탐색해야 한다. 따라서, 리스트에서 값을 찾는 데 걸리는 시간은 최악의 경우 리스트의 크기에 비례하다. O(n).

 

그러므로, set자료형은 요소를 찾는 데 걸리는 시간이 더 빠르기 때문에 리스트보다 시간 복잡도가 더 좋다. 또한 set은 중복된 값을 허용하지 않는 자료형이기 때문에 중복을 제거하거나 고유한 값만을 저장해야 하는 경우에 유용하다.