파이썬에는 집합(set)이라는 데이터 유형도 포함되어 있습니다.
집합은 중복 요소가 없는 숫자 자료 모음입니다. 기본적인 사용 방법에는 멤버십 테스트 및 중복 항목 제거가 포함됩니다. 집합 객체는 합집합, 교집합, 차집합 및 대칭 차집합과 같은 수학적 연산도 지원합니다.
중괄호 또는 set() 함수를 사용하여 집합을 만들 수 있습니다.
참고 : 빈 집합을 만들려면 {}가 아니라 set()을 사용해야합니다. 후자는 빈 사전을 만듭니다. 이는 다음 섹션에서 설명하는 데이터 구조입니다.
세트 기능
- 중복 제거 확인
my_bag = {'pen', 'pencil', 'pencil', 'mugcup', 'book', 'book', 'notebook', 'laptop'}
print(my_bag) # {'laptop', 'book', 'mugcup', 'pencil', 'notebook', 'pen'} 중복제거가 된 것을 확인할 수 있다.
- 멤버십 테스트
- 원소들이 세트에 존재하는지 확인한는 기능
print('notebook' in my_bag) #True 구성에 원소들이 있는지 확인 가능(fast membership testing)
print('mouse' in my_bag) #False
세트 메서드
세트 함수들의 예시는 다음과 같습니다.
add() : 세트에 새로운 원소 추가
- 그런데 결과값의 순서가 계속 달라진다. 왜?-
- >세트에서 add() 함수를 사용하면, 새로운 원소를 세트에 추가할 수 있습니다.
- 그러나 결과값의 순서는 항상 일정하지 않습니다. 이는 파이썬의 내부 구조에서 비롯된 것으로, 세트 내부에서 원소들이 어떻게 저장되는지에 따라 순서가 달라질 수 있습니다.
- 세트는 해시 테이블을 사용하여 구현됩니다. 해시 테이블은 데이터를 저장할 때 각 데이터의 고유한 해시 값을 계산하여 해당 데이터를 저장하는 방식입니다. 이때 해시 값은 데이터의 내용에 따라 결정됩니다. 따라서, 세트에 데이터를 추가할 때마다 해당 데이터의 해시 값을 계산하고, 해시 값에 따라 세트 내부에 저장되는 위치가 결정됩니다. 이때, 데이터의 내용이 같더라도 해시 값이 다르면 세트 내부에 다른 위치에 저장됩니다. 따라서, 결과값의 순서가 항상 일정하지 않을 수 있습니다.
- 세트(set)는 합집합, 교집합, 차집합, 대칭 차집합 등의 수학적 연산을 지원하는 데이터 타입입니다. 세트는 중복 없는 숫자 자료 모음입니다.
fruits = {'apple', 'banana', 'orange'}
fruits.add('mango')
print(fruits)
# {'orange', 'apple', 'mango', 'banana'}
- difference() : 두 개의 세트에서 차집합을 구함
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = a.difference(b) print(c) # {1, 2}
- intersection() : 두 개의 세트에서 교집합을 구함
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = a.intersection(b)
print(c) # {3, 4}
- union() : 두 개의 세트에서 합집합을 구함
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = a.union(b)
print(c) # {1, 2, 3, 4, 5, 6}
- symmetric_difference() : 두 개의 세트에서 대칭 차집합을 구함
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = a.symmetric_difference(b)
print(c) # {1, 2, 5, 6}
- issubset() : 세트가 다른 세트의 부분집합인지 확인
a = {1, 2}
b = {1, 2, 3, 4, 5}
print(a.issubset(b)) # True
- issuperset() : 세트가 다른 세트를 포함하는지 확인
a = {1, 2, 3, 4, 5}
b = {1, 2}
print(a.issuperset(b)) # True
- update() : 세트에 다른 세트의 원소를 추가
a = {1, 2}
b = {3, 4, 5}
a.update(b)
print(a) # {1, 2, 3, 4, 5}
- intersection_update() : 세트를 다른 세트와 교집합으로 갱신
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
a.intersection_update(b)
print(a) # {3, 4}
- difference_update() : 세트에서 다른 세트의 원소를 제거
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
a.difference_update(b)
print(a) # {1, 2}
- symmetric_difference_update() : 세트에서 다른 세트의 대칭 차집합으로 갱신
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
a.symmetric_difference_update(b)
print(a) # {1, 2, 5, 6}
- discard() : 세트에서 지정한 원소를 삭제 (원소가 없어도 오류가 발생하지 않음)
a = {1, 2, 3}
a.discard(2)
print(a) # {1, 3}
a.discard(5)
print(a) # {1, 3}
- remove() : 세트에서 지정한 원소를 삭제 (원소가 없으면 KeyError가 발생)
a = {1, 2, 3}
a.remove(2)
print(a) # {1, 3}
a.remove(5)
# KeyError: 5
- pop() : 임의의 원소를 삭제하고 반환 (세트가 비어 있으면 KeyError가 발생)
- pop() 메서드는 세트에서 임의의 원소를 삭제하고 반환합니다. 그러나 파이썬 3.7 이상에서는 일반적으로 세트에 추가된 순서대로 원소가 유지되는 것으로 변경되어 pop() 메서드는 항상 가장 작은 원소를 반환합니다.
- 따라서, a.pop()의 결과는 1이 나오게 됩니다.
a = {1, 2, 3}
print(a.pop()) # 1
print(a) # {2, 3}
a = set()
print(a.pop())
# KeyError: 'pop from an empty set'
- clear() : 세트에서 모든 원소를 제거
a = {1, 2, 3}
a.clear()
print(a) # set()
두 단어들의 고유한 글자들로 집합 연산 시연
a = set('abracadabra')
b = set('alacazam')
print(a)
# {'c', 'b', 'a', 'r', 'd'} -> a의 고유한 글자들만 출력됨
print(a - b)
# {'b', 'r', 'd'} -> a에 있지만 b에 없는 글자들(차집합)
print(a | b)
# {'l', 'r', 'm', 'a', 'b', 'c', 'd', 'z'} -> a와 b 양쪽에 모두 있는 글자들(합집합)
print(a & b)
# {'c', 'a'} -> a와 b 모두에 있는 글자들(교집합)
print(a^b)
# {'d', 'm', 'l', 'b', 'z', 'r'}
# -> a와 b에 있지만 양쪽 모두에 있지 않은 글자들(합칩합 - 교집합)(=대칭 차집합)
리스트 컴프리헨션도 지원한다.
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a) # {'r', 'd'}
a = set()
for x in 'abracadabra':
if x not in 'abc':
a.add(x)
print(a)
a를 빈 집합으로 초기화하고 add 메서드를 사용하여 새로운 요소를 추가합니다.
마지막으로, 출력할 때 print 함수를 사용하여 set 객체를 출력합니다.
'개발공부 > Python' 카테고리의 다른 글
파이썬으로 커피 자판기 만들기 (1) | 2023.04.16 |
---|---|
파이썬으로 숫자 맞추기 게임 만들기 (1) | 2023.04.15 |
[파이썬] 튜플(Tuple) (0) | 2023.04.13 |
[파이썬] 리스트(List)_메서드, 스택, 큐, 컴프리헨션 (0) | 2023.04.13 |
[파이썬 메서드].reverse() 리스트 뒤집기 / TypeError: 'NoneType' object is not iterable (0) | 2023.04.11 |