Unit 28. 세트 사용하기

파이썬은 집합을 표현하는 세트(set)라는 자료형을 제공합니다. 집합을 영어로 하면 세트인데 수학에서 배우는 그 집합이 맞습니다. 따라서 세트는 합집합, 교집합, 차집합 등의 연산이 가능합니다.

이번 유닛에서는 세트를 만드는 방법과 세트 메서드 사용 방법을 알아보겠습니다.

28.1 세트 만들기

세트는 { }(중괄호) 안에 값을 저장하며 각 요소(값)은 ,(콤마)로 구분해줍니다.

  • 세트 = {값1, 값2, 값3}

간단하게 과일이 들어있는 세트를 만들어보겠습니다.

>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> fruits
{'pineapple', 'orange', 'grape', 'strawberry', 'cherry'}
  • SyntaxError: invalid syntax: { }의 짝이 맞지 않을 때, 문자열의 ' ' 짝이 맞지 않을 때, 각 요소를 구분할 때 ,를 넣지 않아서 발생하는 에러입니다. { }, ' ' 짝이 맞는지, ,를 빠뜨리지 않았는지 확인해주세요.

세트에 들어있는 요소는 순서가 정해져 있지 않습니다(unordered). 그래서 세트를 출력해보면 매번 요소의 순서가 다르게 나옵니다.

또한, 세트에 들어가는 요소는 중복될 수 없습니다. 다음과 같이 세트에 'orange'를 두 개 넣어도 실제로는 한 개만 들어갑니다.

>>> fruits = {'orange', 'orange', 'cherry'}
>>> fruits
{'cherry', 'orange'}

특히 세트는 리스트, 튜플, 딕셔너리와는 달리 [ ](대괄호)로 특정 요소만 출력할 수는 없습니다.

>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> print(fruits[0])
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    print(fruits[0])
TypeError: 'set' object does not support indexing
>>> fruits['strawberry']
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    fruits['strawberry']
TypeError: 'set' object is not subscriptable

이번에는 set를 사용하여 세트를 만들어보겠습니다.

  • set(반복가능한객체)

set에는 반복 가능한 객체(iterable)를 넣습니다(반복 가능한 객체는 '41.1 반복 가능한 객체 알아보기'에서 설명). 여기서는 간단하게 문자열과 range로 세트를 만들어보겠습니다.

set('apple')과 같이 영문 문자열을 세트로 만들면 'apple'에서 유일한 문자인 'a', 'p', 'l', 'e'만 세트로 만들어집니다. 즉, 중복된 문자는 포함되지 않습니다.

>>> a = set('apple')    # 유일한 문자만 세트로 만듦
>>> a
{'e', 'l', 'a', 'p'}

그리고 set(range(5))와 같이 숫자를 만들어내는 range를 사용하면 0부터 4까지 숫자를 가진 세트를 만들 수 있습니다.

>>> b = set(range(5))
>>> b
{0, 1, 2, 3, 4}

빈 세트는 c = set()과 같이 set에 아무것도 지정하지 않으면 됩니다.

>>> c = set()
>>> c
set()

단, 세트가 { }를 사용한다고 해서 c = {}와 같이 만들면 빈 딕셔너리가 만들어지므로 주의해야 합니다. 다음과 같이 type을 사용하면 자료형의 종류를 알 수 있습니다.

  • type(객체)
>>> c = {}
>>> type(c)
<class 'dict'>
>>> c = set()
>>> type(c)
<class 'set'>
참고 | 한글 문자열을 세트로 만들기

set을 사용하여 한글 문자열을 세트로 만들면 다음과 같이 음절 단위로 세트가 만들어집니다.

>>> set('안녕하세요')
{'녕', '요', '안', '세', '하'}
참고 | 세트 안에서 세트 사용하기

세트는 리스트나 딕셔너리와 달리 세트 안에서 세트를 사용할 수 없습니다.

>>> a = {{1, 2}, {3, 4}}
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a = {{1, 2}, {3, 4}}
TypeError: unhashable type: 'set'
참고 | 프로즌 세트

파이썬은 내용을 변경할 수 없는 세트도 제공합니다.

프로즌세트 = frozenset(반복가능한객체)

>>> a = frozenset(range(10))
>>> a
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

이름 그대로 얼어 있는(frozen) 세트입니다. frozenset로 세트를 만들면 뒤에서 설명할 집합 연산, 메서드 중에서 요소를 추가하거나 삭제하는 연산, 메서드는 사용할 수 없습니다. 즉, 다음과 같이 frozenset의 요소를 변경하려고 하면 에러가 발생합니다.

>>> a = frozenset(range(10))
>>> a |= 10
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    a |= 10
TypeError: unsupported operand type(s) for |=: 'frozenset' and 'int'
>>> a.update({10})
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a.update({10})
AttributeError: 'frozenset' object has no attribute 'update'