상세 컨텐츠

본문 제목

파이썬 - 집합(set)

프로그래밍 언어/파이썬

by 별을 보는 사람 2021. 2. 15. 15:53

본문

반응형

집합(set)

집합(set) 생성

집합 생성에는 중괄호 또는 내장 함수를 사용한다.

my_set = {"apple", "banana", "cherry"}
print(my_set)

{'banana', 'apple', 'cherry'}


# 집합(set) 함수를 이용해 생성하거나 
# 리스트, 튜플, 문자열 등을 set() 함수의 인자값으로 사용해 생성한다.
my_set_2 = set(["one", "two", "three"])
my_set_2 = set(("one", "two", "three"))
print(type(my_set_2))
print(my_set_2)

<class 'set'>
{'three', 'one', 'two'}


my_set_3 = set("aaabbbcccdddeeeeeffff")
print(my_set_3)

<class 'set'>
{'c', 'b', 'e', 'a', 'f', 'd'}


# 중의 : 빈 집합(set) 생성 시 {}를 사용할 수 없음. {} 사용 시 딕셔너리로 간주됨.
# 빕 집합(set) 생성에는 내장 함수(set()) 이용해 생성.
a = {}
print(type(a))
a = set()
print(type(a))

<class 'dict'>
<class 'set'>

 

집합(set) 항목 추가

my_set = set()

# add() 메소드를 이용해 항목을 추가함.
my_set.add(42)
my_set.add(True)
my_set.add("Hello")

# 주의 : 항목 추가 시 순서가 정해지지 않기 때문에
# 결과값 추력시 삽입 순서와 다르게 나온다.
print(my_set)

{True, 42, 'Hello'}


# 샵입할 항목이 존재할 경우 집합(set)에 아무런 변화도 생기지 않는다.
my_set.add(42)
print(my_set)

{True, 42, 'Hello'}

 

집합(set) 항목 제거

# remove(x): x는 제거될 항목, 
# 만약 제거될 항목이 존재하지 않으면 KeyError 발생
my_set = {"apple", "banana", "cherry"}
my_set.remove("apple")
print(my_set)

{'banana', 'cherry'}


# KeyError:
# my_set.remove("orange")

Traceback (most recent call last):
  File "c:\workspace\test.py", line 3, in <module>
    my_set.remove("orange")
KeyError: 'apple'


# discard(x): x는 제거될 항목, 
# 만약 제거될 항목이 존재하지 않으면 아무일도 일어나지 않는다.
my_set.discard("cherry")
my_set.discard("blueberry")
print(my_set)


# clear() : 모든 항목 제거
my_set.clear()
print(my_set)


# pop() : 무작위로 선택된 값이 반환하고 제거하다.
a = {True, 2, False, "hi", "hello"}
print(a.pop())
print(a)

False
{True, 2, 'hi', 'hello'}

 

집합(set) 항목 존재 여부 확인

my_set = {"apple", "banana", "cherry"}
if "apple" in my_set:
    print("yes")
    
yes

 

반복문

# 집합(set)에서 반복문 사용항 시 for in loop 문을 사용한다.
# 주의: 항목의 순서는 고려되지 않는다.
my_set = {"apple", "banana", "cherry"}
for i in my_set:
    print(i)
    
cherry
apple
banana 

 

합집합과 교집합

odds = {1, 3, 5, 7, 9}
evens = {0, 2, 4, 6, 8}
primes = {2, 3, 5, 7}

# union() : 중복 없이 두 집합을 합집합을 반환한다.
# 이렇게 해도 두 집합은 변경되지 않습니다.
u = odds.union(evens)
print(u)

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}


# intersection(): 두 집합 간의 차집합을 반환한다.
i = odds.intersection(evens)
print(i)

set()


i = odds.intersection(primes)
print(i)

{3, 5, 7}


i = evens.intersection(primes)
print(i)

{2}

 

집합(set)의 차이

setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setB = {1, 2, 3, 10, 11, 12}

# difference() : 집합B에 존재하지 않는 집합A의 모든 항목을 반환한다.
diff_set = setA.difference(setB)
print(diff_set)

{4, 5, 6, 7, 8, 9}


# A.difference(B)와 B.difference(A)는 결과값이 다르다.
diff_set = setB.difference(setA)
print(diff_set)

# symmetric_difference() : 집합 A와 집합 B에 있지만 둘 다에 있지 않은 모든 요소을 반환합니다.
diff_set = setA.symmetric_difference(setB)
print(diff_set)

# A.symmetric_difference(B)와 B.symmetric_difference(A)의 결과 값은 같다.
diff_set = setB.symmetric_difference(setA)
print(diff_set)

 

집합(set) 수정

setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setB = {1, 2, 3, 10, 11, 12}

# update() : 다른 집합의 요소를 추가해서 집합을 갱신함.
setA.update(setB)
print(setA)

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}


# intersection_update() : 두 집합 간에 공통으로 존재하는 항목 반환(교집합) 
setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setA.intersection_update(setB)
print(setA)

{1, 2, 3}


# difference_update() : 두 집합 간에 한 집합에는 존재하고 
# 다른 집합에는 존재하는 않는 모든 항목 반환.(차집합)
setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setA.difference_update(setB)
print(setA)

{4, 5, 6, 7, 8, 9}


# symmetric_difference_update() : 두 집합 간 교집합의 결과값을 제외한 모든 항목 반환.
setA = {1, 2, 3, 4, 5, 6, 7, 8, 9}
setA.symmetric_difference_update(setB)
print(setA)

# 중요 : 집합의 갱신 함수들은 다른 반복 가능한(iterable) 타입(리스트, 튜플 등)등을 
# 인자로 사용하여도 동일한 결과 값을 얻을 수 있다.
# setA.update([1, 2, 3, 4, 5, 6])

{1, 2, 3, 4, 5, 6, 7, 8, 9}

 

집합(set) 복사

set_org = {1, 2, 3, 4, 5}

# 다음과 같은 경우 단순히 참조만 복사했기 때문에 주의를 요한다.
# (set_copy를 변경할 경우 set_org에도 변경이 일어남!)
set_copy = set_org

# 복사된 set_copy에 수정이 일어나면 원본 set_org에도 똑같이 영향을 미침.
set_copy.update([3, 4, 5, 6, 7])
print(set_copy)
print(set_org)

{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}



# copy() 함수를 이용해 집합(set)을 생성할 경우
# 원본과 동일한 집합이 새로 만들어짐. 
set_org = {1, 2, 3, 4, 5}
set_copy = set_org.copy()

# copy() 함수를 이용해 새로 생성된 집합을 갱신할 경우
# 원본 집합에 영향을 주지 않음.(왜? 원본과 다른 새로운 집합이기 때문에)
set_copy.update([3, 4, 5, 6, 7])
print(set_copy)
print(set_org)

{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5}

 

부분집합(Subset)과 초집합(Superset) 및 분리(Disjoint)

setA = {1, 2, 3, 4, 5, 6}
setB = {1, 2, 3}
# issubset(setX): 임의의 집합(set)에 집합(setX)가 부분집합이면 true를 리턴한다.
print(setA.issubset(setB)) # setA가 setB의 부분집합인가?
print(setB.issubset(setA)) # setB가 setA의 부분집합인가?

False
True


# issuperset(setX): 임의의 집합(set)에 집합(setX)가 확대집합이면 true를 리턴한다
print(setA.issuperset(setB)) # setA가 setB의 확대집합인가?
print(setB.issuperset(setA)) # setB가 setA의 확대집합인가?

True
False


# isdisjoint(setX) : 임의의 집합(set)와 집합(setX)가 공통원소 존재하지 않으면 true를 반환한다.
setC = {7, 8, 9}
print(setA.isdisjoint(setB)) # setA와 setB는 공통원소가 존재하지 않는다.
print(setA.isdisjoint(setC)) # setA와 setC는 공통원소가 존재하지 않는다.

False
True

 

frozenset 집합

일반적인 집합(set)과 다르게 frozenset는 한 번 항목들을 가지고 집합(set)이 만들어 지면 처음 만들어진 항목들을 변경할 수 없다.

 

a = frozenset([0, 1, 2, 3, 4])

# 다음 함수들은 frozenset에 사용할 수 없다.
# a.add(5)
# a.remove(1)
# a.discard(1)
# a.clear()

#에러 발생
Traceback (most recent call last):
  File "c:\workspace\test.py", line 3, in <module>       
    a.add(5)
AttributeError: 'frozenset' object has no attribute 'add'


# 갱신 함수 또한 사용할 수 없다.:
# a.update([1,2,3])

#에러 발생
Traceback (most recent call last):
  File "c:\workspace\test.py", line 3, in <module>
    a.update([1,2,3])
AttributeError: 'frozenset' object has no attribute 'update'


# 사용 가능한 함수들
odds = frozenset({1, 3, 5, 7, 9})
evens = frozenset({0, 2, 4, 6, 8})
print(odds.union(evens))         #합집합
print(odds.intersection(evens))  #교집합
print(odds.difference(evens))    #차집합

frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
frozenset()
frozenset({1, 3, 5, 7, 9})

 

반응형

관련글 더보기

댓글 영역