코딩도장_Unit 26. 세트 사용하기

김민주·2022년 1월 1일
0

AIFFEL_풀잎스쿨

목록 보기
22/23
post-thumbnail

파이썬은 집합을 표현하는 세트(set)라는 자료형을 제공한다.

26.1 세트 만들기

  • 세트는 중괄호({}) 안에 값을 저장하며 각 값은 콤마(,)로 구분
    • 세트 = {값1, 값2, 값3}
>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> fruits
{'pineapple', 'orange', 'grape', 'strawberry', 'cherry'}

📎 참고)에러
SyntaxError: invalid syntax: { }의 짝이 맞지 않을 때, 문자열의 ' ' 짝이 맞지 않을 때, 각 요소를 구분할 때 ,를 넣지 않아서 발생하는 구문 에러

  • 세트는 요소의 순서가 정해져 있지 않다.(unordered) 따라서 세트를 출력해보면 매번 요소의 순서가 다르게 나온다.
  • 세트에 들어가는 요소는 중복될 수 없다.
>>> 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

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

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

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

set를 사용하여 세트 생성

  • set(반복가능한객체)
    • set에는 반복 가능한 객체(iterable)를 넣는다.
    • 중복된 문자는 포함되지 않는다.
    • 숫자를 만들어내는 range를 사용하면 그 범위만큼의 숫자를 가진 세트를 만들 수 있다.
    • 빈 세트는 set에 아무것도 지정하지 않으면 된다.
    • 단, 세트가 중괄호({})를 사용한다고 해서 c = {}와 같이 만들면 빈 딕셔너리가 만들어지므로 주의
>>> a = set('apple')    # 유일한 문자만 세트로 만듦
>>> a
{'e', 'l', 'a', 'p'}

# range를 사용해 세트 생성
>>> b = set(range(5))
>>> b
{0, 1, 2, 3, 4}

# 빈 세트 만들기
>>> c = set()
>>> c
set()

# 기호 사용 주의! 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})

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를 사용하는 이유는 세트 안에 세트를 넣고 싶을 때 사용한다. frozensetfrozenset를 중첩해서 넣을 수 있으나, 일반 set는 넣을 수 없다.

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

26.2 집합 연산 사용하기

세트에서 집합 연산과 이에 대응하는 메서드를 사용해본다. 집합 연산은 파이썬의 산술 연산자와 논리 연산자를 활용한다.

1. |(OR)연산자

  • | 연산자 는 합집합(union)을 구한다.
  • set.union 메서드와 동작이 같다.
    • 세트1 | 세트2
    • set.union(세트1, 세트2)
>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> set.union(a, b)
{1, 2, 3, 4, 5, 6}

2. &(AND)연산자

  • & 연산자는 교집합(intersection)을 구한다.
  • set.intersection 메서드와 동작이 같다.
    • 세트1 & 세트2
    • set.intersection(세트1, 세트2)
>>> a & b
{3, 4}
>>> set.intersection(a, b)
{3, 4}

3. - 연산자

  • - 연산자는 차집합(difference)을 구한다.
  • set.difference 메서드와 동작이 같다.
    • 세트1 - 세트2
    • set.difference(세트1, 세트2)
>>> a - b
{1, 2}
>>> set.difference(a, b)
{1, 2}

3. ^(XOR)연산자

  • ^ 연산자는 대칭차집합(symmetric difference)을 구한다.
  • set.symmetric_difference 메서드와 동작이 같다.
  • OR 연산자의 특성을 그대로 따르는데 XOR은 서로 다르면 참
  • 집합에서는 두 집합 중 겹치지 않는 요소만 포함한다.
    • 세트1 ^ 세트2
    • set.symmetric_difference(세트1, 세트2)
>>> a ^ b
{1, 2, 5, 6}
>>> set.symmetric_difference(a, b)
{1, 2, 5, 6}

26.2.1 집합 연산 후 할당 연산자 사용하기

세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 =을 함께 사용하면 집합 연산의 결과를 변수에 다시 저장(할당)한다.

1. |=

  • 현재 세트에 다른 세트를 더한다.
  • update 메서드와 동일하다.
    • 세트1 |= 세트2
    • 세트1.update(세트2)
>>> a = {1, 2, 3, 4}
>>> a |= {5}
>>> a
{1, 2, 3, 4, 5}

>>> a = {1, 2, 3, 4}
>>> a.update({5})
>>> a
{1, 2, 3, 4, 5}

2. &=

  • 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장
  • intersection_update 메서드와 동일하다.
    • 세트1 &= 세트2
    • 세트1.intersection_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a &= {0, 1, 2, 3, 4}
>>> a
{1, 2, 3, 4}

>>> a = {1, 2, 3, 4}
>>> a.intersection_update({0, 1, 2, 3, 4})
>>> a
{1, 2, 3, 4}

3. -=

  • 현재 세트에서 다른 세트를 뺀다.
  • difference_update 메서드와 같다.
    • 세트1 -= 세트2
    • 세트1.difference_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a -= {3}
>>> a
{1, 2, 4}

>>> a = {1, 2, 3, 4}
>>> a.difference_update({3})
>>> a
{1, 2, 4}

4. ^=

  • 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장
  • symmetric_difference_update 메서드와 동일하다.
    • 세트1 ^= 세트2
    • 세트1.symmetric_difference_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a ^= {3, 4, 5, 6}
>>> a
{1, 2, 5, 6}

>>> a = {1, 2, 3, 4}
>>> a.symmetric_difference_update({3, 4, 5, 6})
>>> a
{1, 2, 5, 6}

26.2.2 부분 집합과 상위집합 확인하기
세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있다. 현재 세트가 다른 세트의 (진)부분집합 또는 (진)상위집합인지 확인할 때는 세트 자료형에 부등호와 등호 사용한다.

1. <=

  • 현재 세트가 다른 세트의 부분집합(subset)인지 확인
  • issubset 메서드와 동일하다.
    • 현재세트 <= 다른세트
    • 현재세트.issubset(다른세트)
>>> a = {1, 2, 3, 4}
>>> a <= {1, 2, 3, 4}
True
>>> a.issubset({1, 2, 3, 4, 5})
True

2. <

  • 현재 세트가 다른 세트의 진부분집합(proper subset)인지 확인
  • 동일한 메서드는 없다.
    • 현재세트 < 다른세트
>>> a = {1, 2, 3, 4}
>>> a < {1, 2, 3, 4, 5}
True

3. >=

  • 현재 세트가 다른 세트의 상위집합(superset)인지 확인
  • issuperset 메서드와 동일하다.
    • 현재세트 >= 다른세트
    • 현재세트.issuperset(다른세트)
>>> a = {1, 2, 3, 4}
>>> a >= {1, 2, 3, 4}
True
>>> a.issuperset({1, 2, 3, 4})
True

4. >

  • 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인
  • 동일한 메서드는 없다.
    • 현재세트 > 다른세트
>>> a = {1, 2, 3, 4}
>>> a > {1, 2, 3}
True

26.2.3 세트가 같은지 다른지 확인하기
세트는 == 연산자를 사용하여 서로 같은지 확인할 수 있다.

>>> a = {1, 2, 3, 4}
>>> a == {1, 2, 3, 4}
True
>>> a == {4, 2, 1, 3}
True

세트는 요소의 순서가 정해져 있지 않으므로 ==로 비교했을 때 각 요소만 같으면 참
!= 연산자는 세트가 다른지 확인한다.

>>> a = {1, 2, 3, 4}
>>> a != {1, 2, 3}
True

26.2.4 세트가 겹치지 않는지 확인하기
disjoint는 현재 세트가 다른 세트와 겹치지 않는지 확인한다.
겹치는 요소가 없으면 True, 있으면 False

  • 현재세트.isdisjoint(다른세트)
>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6, 7, 8})       # 겹치는 요소가 없음
True
>>> a.isdisjoint({3, 4, 5, 6})    # a와 3, 4가 겹침
False

26.3 세트 조작하기
세트를 조작하는 메서드와 세트의 길이(요소 개수)를 구하는 방법을 알아본다.

1. add(요소)

  • 세트에 요소를 추가한다.
>>> a = {1, 2, 3, 4}
>>> a.add(5)
>>> a
{1, 2, 3, 4, 5}

2. remove(요소)

  • 세트에서 특정 요소를 삭제하고 요소가 없으면 에러 발생
>>> a.remove(3)
>>> a
{1, 2, 4, 5}

3. discard(요소)

  • 세트에서 특정 요소를 삭제하고 요소가 없으면 그냥 넘어감
>>> a
{1, 2, 4, 5}
>>> a.discard(2)
>>> a
{1, 4, 5}
>>> a.discard(3)
>>> a
{1, 4, 5}

4. pop()

  • 세트에서 임의의 요소를 삭제하고 해당 요소를 반환
  • 만약 요소가 없으면 에러 발생
>>> a = {1, 2, 3, 4}
>>> a.pop()
1
>>> a
{2, 3, 4}

5. clear()

  • 세트에서 모든 요소 삭제
>>> a.clear()
>>> a
set()

5. len(세트)

  • 세트의 요소 개수(길이) 구함
>>> a = {1, 2, 3, 4}
>>> len(a)
4

26.4 세트의 할당과 복사

세트도 리스트, 딕셔너리처럼 할당과 복사의 차이점이 있다.

1. b = a (할당)

>>> a = {1, 2, 3, 4}
>>> b = a
>>> a is b
True
>>> b.add(5)
>>> a
{1, 2, 3, 4, 5}
>>> b
{1, 2, 3, 4, 5} 
  • b = a와 같이 세트를 다른 변수에 할당하면 세트가 한 개이다.
  • a와 b를 is 연산자로 비교해보면 True가 나온다. 즉 같은 객체이다.
  • a와 b는 같으므로 b에 요소를 추가하면 세트 a와 b에 모두 반영

2. copy 메서드(복사)

>>> a = {1, 2, 3, 4}
>>> b = a.copy()
>>> a is b
False
>>> a == b
True
>>> a = {1, 2, 3, 4}
>>> b = a.copy()
>>> b.add(5)
>>> a
{1, 2, 3, 4}
>>> b
{1, 2, 3, 4, 5}
  • 세트 a와 b를 완전히 두 개로 만들려면 copy 메서드로 모든 요소를 복사해야 한다.
  • a와 b를 is 연산자로 비교해보면 False가 나온다. 즉 다른 객체이다.
  • 복사한 요소는 같으므로 ==로 비교하면 True가 나온다.
  • 세트 a와 b는 별개이므로 한쪽의 값을 변경해도 다른 세트에 영향을 미치지 않는다.

26.5 반복문으로 세트의 요소를 모두 출력하기

for반복문을 사용해 요소를 출력해본다. for in 뒤에 세트만 지정하면 된다.

for 변수 in 세트:
     반복할 코드

for로 세트 a의 요소 출력

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

# 실행결과
1
2
3
4
  • for i in a:는 세트 a에서 요소를 꺼내서 i에 저장하고, 꺼낼 때마다 코드를 반복
  • 세트의 요소는 순서가 없으므로 출력할 때마다 순서가 달라진다.
  • 숫자로만 이루어진 세트는 순서대로 출력
  • in 다음에 세트를 직접 지정해도 무방
for i in {1, 2, 3, 4}:
    print(i)

26.6 세트 표현식 사용하기

세트는 for 반복문과 if조건문을 사용하여 세트를 생성할 수 있다.

  • {} 또는 set() 안에 식, for, 변수, in, 반복 가능한 객체를 지정하여 세트 생성
    • {식 for 변수 in 반복가능한객체}
    • set(식 for 변수 in 반복가능한객체)
>>> a = {i for i in 'apple'}
>>> a
{'l', 'p', 'e', 'a'}  # 문자열에서 중복된 문자는 세트에 포함하지 않음

  • if 조건문은 for 반복문 뒤에 지정
  • if 조건문에 부합한 요소들로 세트 생성
    • {식 for 변수 in 세트 if 조건식}
    • set(식 for 변수 in 세트 if 조건식)
>>> a = {i for i in 'pineapple' if i not in 'apl'}
>>> a
{'e', 'i', 'n'}   # 'a', 'p', 'l' 제외한 문자들로 세트 생성

profile
안녕하세요 :-) 잘 부탁드립니다!

0개의 댓글

관련 채용 정보