WeniVooks

검색

견고한 파이썬

1. Set 이란?

Set 자료형은 집합이라고 부르며, 집합은 여러분이 수학 시간에 배웠던 그 집합과 매우 비슷합니다. 파이썬에서의 집합도 여러 항목들의 모임을 나타내는 자료형입니다. 그러나 리스트나 튜플과는 다르게 집합은 순서가 없으며, 중복된 값도 허용하지 않습니다.

사실 셋은 수학의 집합과 거의 비슷하다고 생각하시면 됩니다. 대표적으로 문서 하나에 있는 단어를 셀때에 모든 단어를 추출 하되 중복이 제거된다면 어떤 단어가 있는지 더 파악하기가 쉽겠죠?

예를 들어, {1, 2, 3, '사과', '바나나'}는 5개의 항목을 가진 집합입니다. 하지만 {1, 2, 2, 3, 3}는 중복된 값이 있기 때문에 실제로는 {1, 2, 3}처럼 3개의 항목만을 가지게 됩니다.

1.1 집합 생성

집합을 생성하는 가장 간단한 방법은 중괄호{}를 사용하고 그 안에 쉼표,로 구분된 데이터들을 넣는 것입니다.

x = {1, 2, 3}
y = {'apple', 'banana', 'cherry'}
x = {1, 2, 3}
y = {'apple', 'banana', 'cherry'}

리스트나 튜플과는 달리, 집합은 순서가 없습니다. 따라서 인덱싱으로 항목에 접근하는 것은 불가능합니다. 하지만 집합 연산이나, 값의 존재 여부 확인 같은 연산은 매우 빠르게 수행됩니다.

또한 set() 함수를 이용해서 다른 자료형을 집합으로 변환할 수도 있습니다.

z = set([1, 2, 3, 3, 3]) print(z) # 출력: {1, 2, 3}

위의 예제를 보면 같은 숫자들은 다 제거되고 하나만 남은 것을 볼 수 있습니다.

문자열도 마찬가지로 set으로 데이터를 변환시 중복되는 문자열을 제거합니다.

string_set = set('apple coffee') print(string_set)

문자열을 넣었을 경우 실행할 때마다 순서가 계속 달라지는 것을 볼 수 있습니다.

1.2 집합의 특징
1.2.1 집합은 중복을 허용하지 않는다

집합의 가장 큰 특징은 중복된 값을 허용하지 않는다는 것입니다. 이는 수학적 집합의 성질과 일치합니다. 만약 중복된 값을 집합에 추가하려고 하면, 그 값은 단 한 번만 저장됩니다.

a = {1, 2, 3, 4, 5, 2, 3} print(a) # 출력: {1, 2, 3, 4, 5}
1.2.2 집합은 순서가 없다

리스트나 튜플은 원소의 순서가 있어서 인덱싱과 슬라이싱이 가능하지만, 집합은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없습니다. 그러나 집합에 특정 값이 있는지 확인하는 것은 가능합니다.

a = {1, 2, 3, 4, 5} # print(a[0]) # 이렇게 하면 에러가 발생합니다! print(3 in a) # 출력: True
1.2.3 왜 집합을 사용할까?

집합은 데이터 중복을 제거하는 데 매우 유용합니다. 또한, 집합 연산을 사용하여 두 그룹의 유사성이나 차이점을 빠르게 파악할 수 있습니다.

2. 집합의 연산

집합은 합집합, 교집합, 차집합과 같은 기본적인 집합 연산을 지원합니다. 이를 활용하면 데이터의 관계를 쉽게 파악할 수 있습니다.

2.1 합집합, 교집합, 차집합 연산
  • 합집합 : 두 집합의 모든 원소를 포함하는 집합을 반환합니다.
    set1 = {1, 2, 3} set2 = {3, 4, 5} union_set = set1 | set2 print(union_set) # 출력: {1, 2, 3, 4, 5}
  • 교집합 : 두 집합에 공통으로 포함된 원소만을 포함하는 집합을 반환합니다.
    set1 = {1, 2, 3} set2 = {3, 4, 5} intersection_set = set1 & set2 print(intersection_set) # 출력: {3}
  • 차집합 : 첫 번째 집합의 원소 중, 두 번째 집합에 포함되지 않은 원소만을 포함하는 집합을 반환합니다.
    set1 = {1, 2, 3} set2 = {3, 4, 5} difference_set = set1 - set2 print(difference_set) # 출력: {1, 2}
2.2 특정 값 확인하기 (in)

집합 내에 특정 값이 있는지 확인할 때도 in 키워드를 사용합니다.

set1 = {1, 2, 3, 4, 5} print(3 in set1) # 출력: True print(6 in set1) # 출력: False

3. 집합의 구조

3.1 집합의 메모리 구조

파이썬의 집합은 딕셔너리와 마찬가지로 해시 테이블을 기반으로 구현되어 있습니다. 각 원소는 테이블 내의 위치(Hash)를 갖게 되며, 이를 통해 빠른 검색이 가능합니다

3.2 집합의 특징

위에서 언급한 집합의 특징을 최종적으로 정리해보겠습니다.

3.2.1 중복 불허

집합에는 동일한 값이 두 번 들어갈 수 없습니다. 즉, 모든 원소는 유일합니다.

3.2.2 순서 없음

집합은 원소의 순서를 유지하지 않습니다. 따라서 인덱싱이나 슬라이싱 같은 연산은 집합에 적용할 수 없습니다.

3.2.3 가변적(mutable)

집합은 원소의 추가 및 삭제가 가능합니다. 하지만, 집합 내의 원소로는 변경 불가능한(immutable) 데이터만 올 수 있습니다. 예를 들어, 리스트는 집합의 원소가 될 수 없지만, 튜플은 될 수 있습니다.

3.2.4 빠른 검색

집합은 해시 테이블 구조를 이용하기 때문에, 원소의 검색이 매우 빠릅니다.

3.2.5 합집합, 교집합, 차집합 등의 연산 지원

집합은 수학에서의 집합 연산을 지원합니다. 이를 통해 두 집합 간의 합집합, 교집합, 차집합 등의 연산을 수행할 수 있습니다.

4. 집합의 메서드

집합의 주요 메서드와 기능을 살펴보겠습니다.

print(dir(set))
# 출력
 
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__ior__', '__isub__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
# 출력
 
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__ior__', '__isub__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

집합도 다양한 메서드를 제공합니다. 몇몇 주요 메서드에 대해 알아보겠습니다.

4.1 add()

집합에 원소를 추가합니다.

set1 = {1, 2, 3} set1.add(4) print(set1) # 출력: {1, 2, 3, 4}
4.2 clear()

집합의 모든 원소를 제거합니다.

set1 = {1, 2, 3, 4} set1.clear() print(set1) # 출력: set()
4.3 copy()

집합의 얕은 복사본을 반환합니다.

set1 = {1, 2, 3} set2 = set1.copy() print(set2) # 출력: {1, 2, 3}
4.4 remove()

특정 원소를 제거합니다. 만약 해당 원소가 집합에 없으면 KeyError가 발생합니다.

set1 = {1, 2, 3, 4} set1.remove(3) print(set1) # 출력: {1, 2, 4} # set1.remove(5) # KeyError
4.5 discard()

remove()와 비슷하게 원소를 제거하지만, 해당 원소가 집합에 없어도 에러가 발생하지 않습니다.

set1 = {1, 2, 3, 4} set1.discard(5) print(set1) # 출력: {1, 2, 3, 4}
4.6 pop()

값을 지우고 싶을 때 pop을 사용합니다.

set의 pop은 실무에서 사용하지 않습니다. 값을 랜덤하게 뽑아내기 때문입니다. 높은 확률로 앞에서부터 뽑아내긴 하지만 확률에 기대는 코딩을 하지 않기를 바랍니다. 공식문서에서는 랜덤하게 뽑아낸다고 되어 있습니다.

Remove and return an arbitrary element from the set. Raises KeyError if the set is empty.

Built-in Types
s = {3, 4, 5, 6, 7, 8} s.pop() print(s) # 가장 확률적으로 출력: {4, 5, 6, 7, 8} s.pop() print(s) # 가장 확률적으로 출력: {5, 6, 7, 8} s.pop() print(s) # 가장 확률적으로 출력: {6, 7, 8}
4.7 difference(others)

모든 others 집합과의 차집합을 반환합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} print(set1.difference(set2)) # 출력: {1, 2}
4.8 difference_update(others)

집합을 others 집합과의 차집합으로 업데이트합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} set1.difference_update(set2) print(set1) # 출력: {1, 2}
4.9 intersection(others)

모든 others 집합과의 교집합을 반환합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} print(set1.intersection(set2)) # 출력: {3, 4}
4.10 intersection_update(others)

집합을 others 집합과의 교집합으로 업데이트합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} set1.intersection_update(set2) print(set1) # 출력: {3, 4}
4.11 isdisjoint(other)

두 집합이 공통 원소를 가지지 않으면 True를 반환합니다.

set1 = {1, 2, 3} set2 = {4, 5, 6} print(set1.isdisjoint(set2)) # 출력: True
4.12 issubset(other)

집합이 other의 부분집합인 경우 True를 반환합니다.

set1 = {1, 2, 3} set2 = {1, 2, 3, 4, 5} print(set1.issubset(set2)) # 출력: True
4.13 issuperset(other)

집합이 other의 상위집합인 경우 True를 반환합니다.

set1 = {1, 2, 3, 4, 5} set2 = {1, 2, 3} print(set1.issuperset(set2)) # 출력: True
4.14 symmetric_difference(other)

두 개의 집합이 있을 때 공통된 부분을 제외한 나머지 부분을 대칭차집합이라고 하며,
^ 또는 symmetric_difference 함수를 사용합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} print(set1^set2) # 출력: {1, 2, 5, 6} print(set1.symmetric_difference(set2)) # 출력: {1, 2, 5, 6}
4.15 symmetric_difference_update(other)

집합을 other와의 대칭차집합으로 업데이트합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} set1.symmetric_difference_update(set2) print(set1) # 출력: {1, 2, 5, 6}
4.16. union(others)

모든 others 집합과의 합집합을 반환합니다.

set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} print(set1.union(set2)) # 출력: {1, 2, 3, 4, 5, 6}
{"packages":["numpy","pandas","matplotlib","lxml"]}
6.4 딕셔너리6.6 연습문제