-
파이썬 기초 : 세트(Set)🐍 Python 2025. 1. 19. 19:55728x90
세트(Set)의 개념 및 특징
- 정의
- 중복을 허용하지 않는(Unique) unordered 컬렉션 자료형.
- 수학에서의 집합과 유사한 개념으로, 교집합, 합집합, 차집합 등의 연산이 가능합니다.
- 특징
- 가변(Mutable): 생성 후에도 세트에 요소를 추가하거나 제거할 수 있습니다.
- 중복 불가: 동일한 요소가 여러 개 있어도 1개만 저장됩니다.
- 순서가 없음(Unordered): 리스트, 튜플과 달리 인덱스로 접근 불가능합니다.
- 내부적으로 해시(Hash) 구조를 사용하므로, 탐색(멤버십) 연산이 빠릅니다. (in, not in)
- 활용 사례
- 중복 제거가 필요한 상황 (예: 데이터 중복 제거, 회원 ID 목록 중복 검증 등)
- 교집합·합집합 연산을 직관적으로 처리해야 하는 상황 (예: 태그 간 교집합, 집단 간 겹치는 요소 확인 등)
세트 생성 및 초기화
- 빈 세트 생성
{} (중괄호만 쓰면 빈 딕셔너리를 의미!) - 초기값이 있는 세트
- set() 생성자 사용
리스트, 튜플 등 다른 반복 가능한(iterable) 객체로부터 세트를 생성할 수 있음 - 주의
- {}를 비어둔 상태로 생성하면, 빈 딕셔너리로 인식됩니다.
- 빈 세트를 만들려면 반드시 set() 함수를 써야 합니다.
세트의 주요 연산 (집합 연산)
세트는 수학의 집합과 유사한 연산을 제공합니다.
- 합집합 (Union)
- set1.union(set2) 또는 set1 | set2
- 교집합 (Intersection)
- set1.intersection(set2) 또는 set1 & set2
- 차집합 (Difference)
- set1.difference(set2) 또는 set1 - set2
- 대칭차집합 (Symmetric Difference)
- set1.symmetric_difference(set2) 또는 set1 ^ set2
- 두 세트에 서로 공통되지 않는 요소들의 집합
- 부분집합, 상위집합 체크
- set1.issubset(set2): set1이 set2의 부분집합인지?
- set1.issuperset(set2): set1이 set2의 상위집합인지?
- set1.isdisjoint(set2): 두 세트가 겹치는 원소가 없는지? (교집합이 없는지)
세트 주요 메서드
세트는 가변 타입이므로, 요소를 추가하거나 제거할 수 있습니다.
- add(value)
- 세트에 단일 값을 추가합니다. 이미 존재하는 값이면 무시.
- update(iterable)
- 다른 세트나 리스트, 튜플 등의 모든 요소를 현재 세트에 추가합니다.
- remove(value)
- 해당 값을 세트에서 삭제합니다. 존재하지 않는 값을 삭제하려 하면 KeyError가 발생.
- discard(value)
- 해당 값을 세트에서 삭제합니다. 존재하지 않아도 에러가 발생하지 않음.
- pop()
- 임의의 요소를 삭제하고, 그 값을 반환합니다. 세트에는 순서가 없으므로, 어떤 요소가 제거될지 모릅니다.
- clear()
- 세트의 모든 요소를 삭제하여 빈 세트로 만듭니다.
세트 활용 예제
1. 이벤트 A, B 참가자 간 중복 확인
- 이벤트 A와 이벤트 B가 동시에 열렸습니다.
- 두 이벤트에 중복으로 신청(또는 참가)한 사람이 있는지 확인하고 싶습니다.
- 교집합(&) 연산을 통해, A와 B 모두 참가한 사람을 빠르게 확인할 수 있습니다.
2. 이벤트 당첨 명단 간 중복 당첨 확인
- 이벤트 A와 B 각각 당첨자 명단이 발표되었습니다.
- 어떤 사람이 두 이벤트에서 모두 당첨되었는지 확인합니다.
- 마찬가지로 교집합을 사용해 중복 당첨 여부를 빠르게 파악할 수 있습니다.
3. 이벤트 A에는 신청했지만, B에는 신청하지 않은 사람 찾기
- 이벤트 A에만 단독으로 신청한 사람(이벤트 B에는 신청하지 않은 사람)을 찾아야 할 때.
- 차집합(-) 연산으로, A에서는 찾을 수 있지만 B에는 없는 사람들을 손쉽게 추출합니다.
4. 두 이벤트 참가자 명단을 합쳐 전체 이벤트 참가자 확인
- 두 이벤트에 참가한 모든 사람(A 또는 B 누구든 참여한 사람)을 한꺼번에 보고 싶습니다.
- 합집합(|) 연산을 통해 모든 참가자를 쉽게 묶어볼 수 있습니다.
5. 새로 들어온 이벤트 신청자와 기존 참가자 중복 체크
- 이벤트 A에 새로 신청한 사람들 중에서, 이미 A에 신청이 되어 있는 사람이 있는지(중복 등록 여부)를 확인합니다.
- 새롭게 들어온 신청자(new_applicants) 중 기존에 등록된 사람(duplicate_applicants)은 교집합으로 확인 후, 중복이 아닌 사람들만(차집합) 최종 세트에 **update()**로 추가할 수 있습니다.
6. 응모자와 당첨자 비교
- 이벤트 B가 끝났고, 당첨자와 응모자(신청자) 목록이 있습니다.
- 응모했지만 당첨되지 못한 사람, 당첨되지 않았는데 다른 이벤트 기회를 줄 수 있는지 등을 확인할 때.
- 당첨자와 전체 응모자의 차집합으로, 당첨되지 못한 사람을 쉽게 가려낼 수 있습니다.
7. 이벤트 상품 중복 당첨 방지 (설계 예시)
- 여러 이벤트를 진행할 때, 한 사람이 여러 상품을 동시에 받지 못하도록 해야 한다면?
- 마찬가지로 교집합을 통해, 중복 상품 수령자를 자동으로 찾아서 처리가 가능합니다.
frozenset: 변경 불가능한 세트
- **frozenset**은 세트와 달리 불변(Immutable) 세트입니다.
- 한 번 생성하면 요소를 변경할 수 없고, 세트와 마찬가지로 집합 연산은 가능합니다.
- 딕셔너리 키나 다른 세트의 원소로 사용해야 하는 경우(기본 세트는 가변이라 사용할 수 없음)에 유용합니다.
주요 메서드 및 기능 표 (요약)
메서드 연산설명 예시 (코드 / 결과) 생성 {요소1, 요소2, ...}, set( iterable ) my_set = {1, 2, 3}, my_set2 = set([2, 3, 3, 4]) 추가 add(value), update(iterable) s.add(5), s.update([4, 5, 6]) 삭제 remove(value), discard(value), pop(), clear() s.remove(3), s.discard(99), removed = s.pop() 합집합 set1.union(set2) 또는 set1 | set2 {1,2}.union({2,3}) → {1,2,3} 교집합 set1.intersection(set2) 또는 set1 & set2 {1,2}.intersection({2,3}) → {2} 차집합 set1.difference(set2) 또는 set1 - set2 {1,2,3}.difference({2,3}) → {1} 대칭차집합 set1.symmetric_difference(set2) 또는 set1 ^ set2 {1,2,3}.symmetric_difference({2,3,4}) → {1,4} 부분집합, 상위집합 체크 issubset(), issuperset(), isdisjoint() {1,2}.issubset({1,2,3}) → True 멤버십 테스트 value in set, value not in set if 3 in s: print("3이 있습니다") 순서 없음(Unordered) 세트는 인덱스로 접근할 수 없음 s[0] → 에러 frozenset 불변(Immutable) 세트, 세트와 같은 연산 가능 fs = frozenset({1,2,3}) (add/remove 불가) 728x90'🐍 Python' 카테고리의 다른 글
파이썬 기초 : 조건문 , 반복문 (0) 2025.01.20 파이썬 기초 : 튜플(Tuple) (0) 2025.01.19 파이썬 기초 : 딕셔너리(Dictionary) (0) 2025.01.19 파이썬 기초 : 리스트(List) (1) 2025.01.19 파이썬 기초 : 리스트(List), 딕셔너리(Dictionary), 튜플(Tuple), 세트(Set) (0) 2025.01.19 - 정의