본문 바로가기
Python/파이썬 기초

집합형(set, frozenset)과 관련 함수/메서드 - 파이썬 기초(6)

by 콩돌 2018. 11. 18.
반응형

참고 자료

https://docs.python.org/3/library/stdtypes.html



파이썬 버전 3.7 기준



파이썬 자료형 및 연산자(5)


집합형


집합형(set, frozenset)은 순서가 없는 컬렉션이며, 해시 가능※한 객체로 구성되어있다.

일반적으로 멤버십(원소와 집합사이의 귀속 관계) 검사, 시퀀스에서의 중복 제거와 교집합, 합집합, 차집합, 대칭 차집합과 같은 수학연산을 수행하는데 사용된다.

다른 시퀀스형과 마찬가지로, x in set, len(set), 컴프리헨션과 같은 기능을 제공하지만, 삽입순서를 기록하지는 않는다. 따라서 인덱싱이나 슬라이싱은 사용이 불가능하다.


 

※ 해시가능(hashable)?

  - 객체가 변하지 않는 해시값을 가지면서, 다른 객체외 비교될 수 있을 경우에 해시가능하다고 표현한다.

  - 같다고 비교되는 해시가능한 객체들은 해시값이 같아야한다.

  - 파이썬에서는 불변 내장 객들은 해시 가능하나, 가변 컨테이너의 경우 그렇지 않다.

  - 사용자 정의 클래스의 인스턴스 객체들은 기본적으로 해시 가능하다.

  - 해시값을 확안하려면 hash()함수를 이용하면된다. 



set([iterable])


  ○ set은 가변형이고 해시값이 따로 존재하지 않는다. 

  ○ 따라서 add()나 remove() 메서드를 통해 요소를 붙여넣거나 제거할 수 있다.


frozenset([iterable])


  ○ frozenset은 불변형이고 해시값이 존재하므로 해시 가능하다.

  ○ 만들어진 후부터 수정이 불가능하며, 딕셔너리 키 또는 다른 집합의 원소로 사용이 가능하다.



가변형(set)과 불변형(frozenset)의 공통 연산/메서드


연산자/메서드

사용 예

의미

비고

len()

len(s)

집합 s의 원소수를 반환한다. 

 

in

x in s 

집합 s에 대해 원소 x가 포함되어 있는지(귀속되어 있는지) 검사한다. 

not in

x not in s

집합 s에 대해 원소 x가 포함되어있지 않은지(귀속되어 있지 않은지) 검사한다.

isdisjoint()

s.isdisjoint(other) 

 집합 s가 other와 공통 원소를 가지지 않는 경우 True를 반환한다. 

즉, 두 집합의 교집합이 공집합일 경우(서로소, disjoint) True를 반환한다. 

 

 issubset()

<=

s.issubset(other)

s <= other 

집합 s의 모든 원소가 other에 포함되는지 검사하며, 포함될 경우 True를 반환한다. 


 <

s < other 

집합 s가 other의 진 상위 집합인지 검사한다.

즉, s >= other and s != other와 같다. 

 union(*others)

|

s1.union(s2, s3, ...)

s1 | s2 | ...

s1과 s2, ...의 합집합을 반환한다. 

 intersection(*others)

&

s1.intersection(s2, s3, ...)

s1 & s2 & ... 

s1과 s2, ...의 교집합(공통원소)을 반환한다.

difference(*others)

-

s1.difference(s2, s3, ..)

s1 - s2 - ... 

s1에 대해 s2, ..의 차집합을 반환한다.

symmetric_difference()

^

s1.symmetric_difference(s2)

s1 ^ s2

s1과 s2의 대칭차집합을 반환한다.

copy()

s.copy()

 집합 s의 얕은 복사를 반환한다.

 


※ 연산자가 아닌 union(), intersection(), ...과 같은 메서드는 임의의 시퀀스형 자료를 받아드릴 수 있다. 

  - 즉, set('abc') | 'dfg'는 에러가 나지만, set('abc').union('dfg')는 정상적으로 출력한다.

  - 따라서 연산자형보다는 메서드형이 가독성측면이나 오류발생 측면에서 더 선호된다.

※ set의 인스턴스는 원소를 기반으로 하여 frozenset의 인스턴스와 비교한다.

  - 즉, set('abc') == frozenset('abc')는 참이고, set('abc') in frozenset('abc')도 참이다. 

※ 집합에서의 비교 연산자(<,>,==)는 서로 부분 집합이 아닐 경우 모두 False을 출력한다.

※ 집합형에서는 순서가 정의되지 않으므로 sort()와 같은 메서드로 결과를 정의할 수 없다. 

※ 집합의 원소는 반드시 해시가능해야한다.

※ set과 fronzenset을 혼합한 연산의 경우 결과를 첫번째 피연산자의 자료형으로 반환한다.

  - 예를들어, set('abc')|frozenset('dfg')의 자료형은 set이다.



가변형(set) 연산/메서드


연산자/메서드

사용 예

의미

비고

update(*others)

|=

s1.update(s2, s3, ...)

s1 |= s2 | s3 | ... 

집합 s1, s2, s3, ...의 모든 집합을 더하여(합집을 계산하여) s1에 갱신시킨다. 

intersection_update(*others)

&=

s1.intersection_update(s2, s3, ...)

s1 &= s2 & s3 & ...

집합 s1, s2, s3, ..의 교집합을 계산하여 s1에 갱신시킨다. 

 difference_update(*others)

-=

 s1.difference_update(s2, s3, ...)

 s1 -= s2 | s3 | ...

집합 s1에 s2, s3, ..등등을 뺀 차집합을 계산하여 s1에 갱신시킨다. 

symmetric_difference_update()

^= 

s1.symmetric_difference_update(s2)

s1 ^= s2

집합 s1과 s2의 대칭차집합을 계산하여 s1에 갱신시킨다. 

 add()

s1.add(x)

집합 s1에 요소 x를 추가한다. 

remove()

s1.remove(x)

집합 s1에 요소 x를 제거한다.

요소 x가 s1에 포함되어 있지 않은 경우 에러를 일으킨다. 

discard()

s1.discard(x)

원소 x가 집합 s1에 포함되어 있으면 이를 제거한다. 

pop()

s1.pop()

집합 s1에 있는 임의의 원소를 제거한다.

집합이 비어있는 경우 에러를 일으킨다. 

 

clear()

s1.clear()

집합 s1의 모든 원소를 제거한다. 

 


※ 위의 공통연산자와 마찬가지로 연산자가 아닌 update(), intersection_update(), ...과 같은 메서드는 임의의 시퀀스형 자료를 받아드릴 수 있다. 

※ add(), remove(), discard()인자는 원소가 아니라 set을 입력한 것도 가능하다.



반응형

댓글