[Python 기초]

[Python] SET 정리

dyk98 2024. 11. 26. 20:09

Set

set은 순서가 없고, 중복을 허용하지 않는 데이터 구조입니다. 수학적 집합의 개념을 기반으로 하며, 데이터 정리 및 비교 작업에서 효율적으로 사용됩니다.

1. 특징

중복 허용하지 않음 동일한 값이 여러 번 추가되더라도 하나의 요소만 유지. {1, 2, 2, 3} → {1, 2, 3}
순서 없음 요소의 위치가 정해져 있지 않으며, 순서가 보장되지 않음. {3, 1, 2} → 출력 순서: {1, 2, 3} (랜덤 배치 가능)
가변 객체 요소를 추가(add)하거나 제거(remove)할 수 있음. s.add(4) → {1, 2, 3, 4}
효율적 멤버십 테스트 in 연산을 통해 O(1) 시간 복잡도로 요소 검색 가능. 4 in {1, 2, 3} → False
해시 가능성 리스트, 딕셔너리와 같은 가변 객체는 저장할 수 없음. s.add([1, 2, 3]) → TypeError

2. 사용 사례

2.1 중복 제거

  • 리스트나 다른 컬렉션에서 중복된 값을 제거할 때 유용.
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = set(data)
print(unique_data)  # {1, 2, 3, 4, 5}

2.2 집합 연산

  • set은 수학적 집합 연산(합집합, 교집합, 차집합)을 효율적으로 지원.
# 두 학생 집합에서 공통 학생 추출 (교집합)
students_1 = {"Alice", "Bob", "Charlie"}
students_2 = {"Bob", "Diana", "Charlie"}

common_students = students_1.intersection(students_2)
print(common_students)  # {'Charlie', 'Bob'}

2.3 효율적인 검색

  • set은 해시 기반 자료구조로, 요소의 존재 여부를 빠르게 확인할 수 있음.
ids = {101, 102, 103}
print(101 in ids)  # True
print(105 in ids)  # False

2.4 데이터 비교

  • 두 데이터셋의 차이를 계산하거나 공통되지 않은 데이터를 추출할 때 유용.
# 구매하지 않은 항목 찾기
all_items = {"apple", "banana", "cherry"}
purchased = {"banana", "cherry"}

not_purchased = all_items.difference(purchased)
print(not_purchased)  # {'apple'}

3. 주요 메서드와 활용

add(x) 요소 x를 추가 s.add(4) → {1, 2, 3, 4}
remove(x) 요소 x를 제거 (존재하지 않으면 KeyError) s.remove(3) → {1, 2}
discard(x) 요소 x를 제거 (존재하지 않아도 에러 없음) s.discard(5)
union(set2) 두 집합의 합집합 반환 {1, 2}.union({3, 4}) → {1, 2, 3, 4}
intersection(set2) 두 집합의 교집합 반환 {1, 2}.intersection({2, 3}) → {2}
difference(set2) 첫 번째 집합에서 두 번째 집합 요소 제거 {1, 2, 3}.difference({2}) → {1, 3}
isdisjoint(set2) 두 집합이 공통 요소가 없는지 확인 {1, 2}.isdisjoint({3, 4}) → True

4. 실전 활용 예제

4.1 중복 제거 및 정리

  • 대량의 데이터에서 중복을 제거하여 고유한 값만 남김.
emails = ["test@example.com", "user@example.com", "test@example.com"]
unique_emails = set(emails)
print(unique_emails)  # {'user@example.com', 'test@example.com'}

4.2 집합 연산

  • 특정 조건을 만족하는 데이터 추출 및 처리.
# 두 집합의 합집합
odd = {1, 3, 5, 7}
even = {2, 4, 6, 8}

union_set = odd.union(even)
print(union_set)  # {1, 2, 3, 4, 5, 6, 7, 8}

# 교집합
intersection_set = odd.intersection({1, 2, 3})
print(intersection_set)  # {1, 3}

4.3 효율적인 데이터 검색

  • 특정 값의 존재 여부를 빠르게 확인.
valid_ids = {1001, 1002, 1003, 1004}
input_id = 1003

if input_id in valid_ids:
    print("유효한 ID입니다.")
else:
    print("유효하지 않은 ID입니다.")

5. 주의점

  1. 순서가 없음:
    • set은 순서를 보장하지 않으므로 출력 순서가 일정하지 않을 수 있음.
  2. 중복 제거:
    • 동일한 값이 여러 번 추가되더라도 하나의 요소만 유지.
  3. 해시 가능성:
    • 가변 객체(리스트, 딕셔너리 등)는 set의 요소로 사용할 수 없음.
    s = set()
    s.add([1, 2, 3])  # TypeError 발생
    
  4. remove()와 discard() 차이:
    • remove(): 제거하려는 요소가 없으면 KeyError 발생.
    • discard(): 요소가 없더라도 에러 없이 진행.

'[Python 기초]' 카테고리의 다른 글

[Python] 제어문 (Control Statements) 정리  (1) 2024.11.26
[Python] Data type 정리  (0) 2024.11.26
[Python] Dictionary 정리  (2) 2024.11.26
[Python] Hash 간단 정리  (0) 2024.11.26
[Python] LIST 정리  (0) 2024.11.26