파이썬의 세트(set)는 중복 없는 해시 가능한 객체들을 담는 순서 없는 컬렉션입니다. 세트를 활용하면 합집합(union), 교집합(intersection), 차집합(difference) 같은 수학적 집합 연산을 간편하게 수행할 수 있으며, 컬렉션에서 중복 요소를 제거하는 용도로도 널리 사용됩니다.
세트는 요소의 위치(순서)를 기록하지 않기 때문에 인덱싱, 슬라이싱 등 시퀀스 관련 연산은 지원하지 않습니다.
파이썬에는 두 가지 세트 타입이 있습니다. 바로 set과 frozenset입니다. set은 가변(mutable) 타입이라 add(), remove() 같은 변경 작업이 가능하지만, frozenset은 불변(immutable) 타입이라 한번 생성하면 요소를 추가하거나 삭제할 수 없습니다.
세트의 주요 메서드와 연산
len(s)
세트에 포함된 요소의 개수를 반환합니다.
x in s / y not in s
in과 not in 연산자는 특정 요소의 멤버십 여부를 확인합니다. 'x in s'는 값 x가 세트 s에 존재할 때 True를 반환하고, 'y not in s'는 요소 y가 세트에 없을 때 True를 반환합니다.
isdisjoint(other_set)
현재 세트와 other_set이 서로소(disjoint) 관계인지 검사합니다. 두 세트 사이에 공통 요소가 하나라도 존재하면 False를 반환합니다.
issuperset(other_set)
other_set의 모든 요소가 현재 세트에도 포함되어 있는지 확인합니다. 즉, 현재 세트가 other_set의 상위 집합(superset)인지 판단한 결과를 반환합니다.
union(other_set)
현재 세트와 other_set의 모든 요소를 합쳐서 새로운 세트를 반환합니다. (합집합)
intersection(other_set)
두 세트에 공통으로 존재하는 요소들만 모아 새로운 세트를 반환합니다. (교집합)
difference(other_set)
첫 번째 세트에서 두 세트의 공통 요소를 제외한 나머지 요소들로 구성된 세트를 반환합니다. (차집합)
add(elem)
세트에 요소 elem을 추가합니다.
discard(elem)
세트에서 요소 elem을 제거합니다. elem이 세트에 존재하지 않더라도 오류가 발생하지 않습니다. 반면 remove() 메서드는 제거하려는 요소가 없을 경우 KeyError 예외를 발생시킵니다.
예제 코드
mySet1 = {1, 2, 5, 6}
mySet2 = {8, 5, 3, 4}
mySet3 = set(range(15)) # 0부터 14까지의 모든 요소를 가진 세트
mySet4 = {10, 20, 30, 40}
print(set(mySet1.union(mySet2)))
print(set(mySet1.intersection(mySet2)))
print(set(mySet1.difference(mySet2)))
print(mySet3.issuperset(mySet1))
print(mySet1.isdisjoint(mySet4))
mySet4.add(45)
print(mySet4)
mySet4.discard(40)
print(mySet4)
실행 결과
set([1, 2, 3, 4, 5, 6, 8]) set([5]) set([1, 2, 6]) True True set([40, 10, 20, 45, 30]) set([10, 20, 45, 30])
위 코드에서 mySet1과 mySet2의 합집합은 {1, 2, 3, 4, 5, 6, 8}, 교집합은 {5}, 차집합(mySet1 − mySet2)은 {1, 2, 6}입니다. 0~14 범위의 요소를 가진 mySet3은 mySet1을 완전히 포함하므로 issuperset()이 True를 반환하고, 공통 요소가 없는 mySet1과 mySet4에 대해서는 isdisjoint()가 True를 반환합니다. 마지막으로 add()로 45를 추가하고 discard()로 40을 제거한 결과도 출력에서 확인할 수 있습니다.