26.1 세트 만들기

Unit 26. 세트 사용하기

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

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

26.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

26.1.1  세트에 특정 값이 있는지 확인하기

그럼 세트에 특정 값이 있는지 확인하려며 어떻게 해야 할까요? 지금까지 리스트, 튜플, 딕셔너리에 사용했던 in 연산자를 사용하면 됩니다.

  • 값 in 세트
>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> 'orange' in fruits
True
>>> 'peach' in fruits
False

이처럼 세트에 특정 값이 있으면 True, 없으면 False가 나옵니다. 세트 fruits'orange'가 있으므로 True, 'peach'가 없으므로 False가 나왔습니다.

반대로 in 앞에 not을 붙이면 특정 값이 없는지 확인합니다.

  • 값 not in 세트
>>> 'peach' not in fruits
True
>>> 'orange' not in fruits
False

이렇게 not in은 특정 값이 없으면 True, 있으면 False가 나옵니다.

26.1.2  set를 사용하여 세트 만들기

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

  • set(반복가능한객체)

set에는 반복 가능한 객체(iterable)를 넣습니다(반복 가능한 객체는 '?39.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'

그런데 요소를 변경할 수 없는 frozenset는 왜 사용할까요? frozenset는 세트 안에 세트를 넣고 싶을 때 사용합니다. 다음과 같이 frozensetfrozenset를 중첩해서 넣을 수 있습니다. 단, frozenset만 넣을 수 있고, 일반 set는 넣을 수 없습니다.

>>> frozenset({frozenset({1, 2}), frozenset({3, 4})})
frozenset({frozenset({1, 2}), frozenset({3, 4})})