[python] 세트 사용하기

세트 만들기

# 집합을 표현하는 set라는 자료형이 있다.
# 실제 우리가 수학에서 배웠던 집합과 같기 때문에 합,교,차집합 등의 연산 가능
# 세트는 중괄호 안에 값을 저장하며 각 값은 ,로 구분한다.
# 세트는 요소의 순서가 정해져있지 않아 출력해보면 매번 요소의 순서가 다르게 나온다.
fruits = {'grape', 'orange', 'apple'}
print(fruits)

# 또한 세트의 요소는 중복될 수 없어서 같은 걸 두번 넣어도 한번만 들어간다.
fruits = {'grape', 'orange', 'orange', 'apple'}
print(fruits)

# 세트는 대괄호로 특정 요소만 출력할 수는 없다.
# ex) fruits[0], fruits['grape']  같은 것들이 불가능

# 세트에 특정 값이 있는지 확인하려면 여태 썼던것처럼 in을 사용하면 된다.
print('grape' in fruits)
print('grape' not in fruits)

# set(반복 가능한 객체)를 하여 세트를 만들 수 있다.
a = set('apple')  # 유일한 문자만 세트로 만든다.
print(a)

a = set(range(0, 5))
print(a)

# 빈 세트는 다음과 같이 만들 수 있다.
a = set()
print(a)

# 세트 안에 세트를 넣을 수 없다.
# {{1, 2}, {3, 4}} 와 같은 것들이 불가능

# frozenset(반복 가능한 객체)를 이용해 내용을 변경할 수 없는 세트도 제공한다.
a = frozenset(range(5))
print(a)

# frozenset는 세트 안에 세트를 넣고 싶을 때 사용한다.
a = frozenset({frozenset(range(2)), frozenset(range(3))})
print(a)

집합 연산 사용하기

# 집합 연산은 파이썬의 산술, 논리 연산자를 활용한다.
# | 연산자는 합집합을 구하며, set.union 메소드와 동작이 같다.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)  # {1, 2, 3, 4, 5, 6}
print(set.union(a, b))  # {1, 2, 3, 4, 5, 6}

# & 연산자는 교집합을 구하며, set.intersection 메소드와 동작이 같다.
print(a & b)  # {3, 4}
print(set.intersection(a, b))  # {3, 4}

# - 연산자는 차집합을 구하며, set.difference 메소드와 동작이 같다.
print(a - b)  # {1, 2}
print(set.difference(a, b))  # {1, 2}

# ^ 연산자는 대칭차집합을 구하며, set.symmetric_difference 메소드와 동작이 같다.
print(a ^ b)  # {1, 2, 5, 6}
print(set.symmetric_difference(a, b))  # {1, 2, 5, 6}

# 세트 자료형에 |, &, -, ^ 연산자와 = 연산자를 함께 사용하면 연산의 결과를 변수에 할당한다.
# 세트1 |= 세트2 는 현재 세트에 다른 세트를 더하며 update 메소드와 같다.
a |= {5}
print(a)  # {1, 2, 3, 4, 5}
a.update({6})
print(a)  # {1, 2, 3, 4, 5, 6}

# 세트1 &= 세트2 는 현재 세트와 다른 세트 중 겹치는 요소만 현재 세트에 저장하며 intersection_update 메소드와 같다.
a &= {0, 1, 2, 3, 4}
print(a)  # {1, 2, 3, 4}
a.intersection_update({1, 2, 3, 4, 5})
print(a)  # {1, 2, 3, 4}

# 세트1 -= 세트2 는 현재 세트에서 다른 세트를 빼며 difference_update 메소드와 같다.
a -= {3}
print(a)  # {1, 2, 4}
a.difference_update({4})
print(a)  # {1, 2}

# 세트1 ^= 세트2 는 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하며,
# symmetric_difference_update 메소드와 같다.
a ^= {2, 3, 4}
print(a)  # {1, 3, 4}
a.symmetric_difference_update({2, 3, 4})
print(a)  # {1, 2}

# 세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있다.
# <= 는 현재 세트가 다른 세트의 부분집합인지 확인하며, issubset 메소드와 동작이 같다.
a = {1, 2, 3, 4}
print(a <= {1, 2, 3, 4})  # True
print(a.issubset({1, 2, 3, 4, 5}))  # True

# < 는 현재 세트가 다른 세트의 진부분집합(부분집합이지만 같지는 않음)인지 확인한다.
print(a < {1, 2, 3, 4})  # False
print(a < {1, 2, 3, 4, 5})  # True

# >= 는 현재 세트가 다른 세트의 상위집합인지 확인하며 issuperset 메소드와 동작이 같다.
print(a >= {1, 2, 3, 4})  # True
print(a.issuperset({1, 2, 3, 4, 5}))  # False

# > 는 현재 세트가 다른 세트의 진상위집합(상위집합이지만 같지는 않음)인지 확인한다.
print(a > {1, 2, 3})  # True
print(a > {1, 2, 3, 4})  # False

# ==와 != 를 이용해 세트와 내용이 서로 같은지 다른지 확인할 수 있다.
# 세트는 요소의 순서가 정해져있지 않기 때문에 내용만 확인한다.
print(a == {1, 2, 3, 4})  # True

# 현재세트.isdisjoint(다른 세트) 는 현재 세트가 다른 세트와 겹치지 않는지 확인한다.
print(a.isdisjoint({5, 6, 7, 8}))  # True
print(a.isdisjoint({4, 5, 6, 7}))  # False

세트 조작하기

# add(요소)로 세트에 요소를 추가할 수 있다.
a = set()
a.add(1)
a.add(2)
print(a)  # {1, 2}

# remove(요소)로 세트의 요소를 삭제할 수 있다. 만약 요소가 없으면 에러를 발생시킨다.
a.remove(1)
print(a)  # {2}

# discard(요소)로 세트에서 특정 요소를 삭제할 수 있다. 만약 요소가 없다면 그냥 넘어간다.
a.discard(2)  # 그냥 넘어간다
a.discard(1)  # 삭제
print(a)  # 빈 세트이므로 set()

# pop() 으로 세트에서 임의의 요소를 삭제하고 해당 요소를 반환할 수 있다.
# 만약 요소가 없다면 에러를 발생시킨다.
a = {1, 2, 3, 4}
print(a.pop())

# clear()는 세트에서 모든 요소를 삭제한다.
a.clear()
print(a)  # set()

# len(세트) 로 세트의 요소 개수를 구할 수 있다.
a = {1, 2, 3, 4, 5}
print(len(a))  # 5

세트의 할당과 복사

# 세트도 리스트, 딕셔너리처럼 할당과 복사의 차이점이 있다.
a = {1, 2, 3, 4}
b = a
print(a is b)  # 이름만 다를 뿐 같은 객체이기 때문에 True
b.add(5)
print(a)  # 같은 객체이기 때문에 b에 요소를 추가하면 a에도 반영된다.  {1, 2, 3, 4, 5}

# 세트 a와 b를 완전히 두개로 만들려면 copy 메소드로 모든 요소를 복사해야 한다.
b = a.copy()
print(a is b)  # 다른 객체이므로 False
print(a == b)  # 두 세트의 내용은 같으므로 True

반복문으로 세트의 요소 출력하기

a = {1, 2, 3, 4, 5}
# 아래와 같이 간단하게 출력을 할 수 있다.
for i in a:
    print(i)

세트 표현식 사용하기

# 세트 또한 for과 if를 사용해서 세트를 생성할 수 있다.
# {식 for 변수 in 반복 가능한 객체}
# set(식 for 변수 in 반복 가능한 객체)
a = {i for i in 'apple'}
print(a)  # {'a', 'e', 'p', 'l'}

a = {i for i in 'pineapple' if i not in 'apl'}
print(a)  # {'e', 'n', 'i'}

Updated:

Leave a comment