ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 기초 : 세트(Set)
    🐍 Python 2025. 1. 19. 19:55
    728x90

    세트(Set)의 개념 및 특징

    1. 정의
      • 중복을 허용하지 않는(Unique) unordered 컬렉션 자료형.
      • 수학에서의 집합과 유사한 개념으로, 교집합합집합차집합 등의 연산이 가능합니다.
    2. 특징
      • 가변(Mutable): 생성 후에도 세트에 요소를 추가하거나 제거할 수 있습니다.
      • 중복 불가: 동일한 요소가 여러 개 있어도 1개만 저장됩니다.
      • 순서가 없음(Unordered): 리스트, 튜플과 달리 인덱스로 접근 불가능합니다.
      • 내부적으로 해시(Hash) 구조를 사용하므로, 탐색(멤버십) 연산이 빠릅니다. (in, not in)
    3. 활용 사례
      • 중복 제거가 필요한 상황 (예: 데이터 중복 제거, 회원 ID 목록 중복 검증 등)
      • 교집합·합집합 연산을 직관적으로 처리해야 하는 상황 (예: 태그 간 교집합, 집단 간 겹치는 요소 확인 등)

    세트 생성 및 초기화

    1. 빈 세트 생성
      {} (중괄호만 쓰면 빈 딕셔너리를 의미!)
       
    2. 초기값이 있는 세트
      중복 요소는 자동 제거 → {1, 2, 3}
    3. set() 생성자 사용
      리스트, 튜플 등 다른 반복 가능한(iterable) 객체로부터 세트를 생성할 수 있음
       
    4. 주의
      • {}를 비어둔 상태로 생성하면, 빈 딕셔너리로 인식됩니다.
      • 빈 세트를 만들려면 반드시 set() 함수를 써야 합니다.

    세트의 주요 연산 (집합 연산)

    세트는 수학의 집합과 유사한 연산을 제공합니다.

    1. 합집합 (Union)
      • set1.union(set2) 또는 set1 | set2
    2. 교집합 (Intersection)
      • set1.intersection(set2) 또는 set1 & set2
    3. 차집합 (Difference)
      • set1.difference(set2) 또는 set1 - set2
    4. 대칭차집합 (Symmetric Difference)
      • set1.symmetric_difference(set2) 또는 set1 ^ set2
      • 두 세트에 서로 공통되지 않는 요소들의 집합
    5. 부분집합, 상위집합 체크
      • set1.issubset(set2): set1이 set2의 부분집합인지?
      • set1.issuperset(set2): set1이 set2의 상위집합인지?
      • set1.isdisjoint(set2): 두 세트가 겹치는 원소가 없는지? (교집합이 없는지)

    세트 주요 메서드

    세트는 가변 타입이므로, 요소를 추가하거나 제거할 수 있습니다.

    1. add(value)
      • 세트에 단일 값을 추가합니다. 이미 존재하는 값이면 무시.
    2. update(iterable)
      • 다른 세트나 리스트, 튜플 등의 모든 요소를 현재 세트에 추가합니다.
    3. remove(value)
      • 해당 값을 세트에서 삭제합니다. 존재하지 않는 값을 삭제하려 하면 KeyError가 발생.
    4. discard(value)
      • 해당 값을 세트에서 삭제합니다. 존재하지 않아도 에러가 발생하지 않음.
    5. pop()
      • 임의의 요소를 삭제하고, 그 값을 반환합니다. 세트에는 순서가 없으므로, 어떤 요소가 제거될지 모릅니다.
    6. 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
Designed by Tistory.