[Python-basic][Data type] Set
Set
set은 mutable 자료형이다.
set()으로 set 정의하기
set을 정의하기 위해 set() 함수를 사용하거나 아니면 {} 기호 안에 콤마를 넣는 식으로 정의할 수 있다.
empty_set = set()
print(empty_set)
even_numbers = {0, 2, 4, 6, 8}
print(even_numbers)
odd_numbers = {1, 3, 5, 7, 9}
print(odd_numbers)
set()
{0, 2, 4, 6, 8}
{1, 3, 5, 7, 9}
dictionary의 key처럼 set도 순서는 없다.
{} 자체는 빈 set이 아닌 빈 dictionary를 정의한다.
위 예제에서 {}안에 요소들을 대입하여 set을 만들었는데, set과 dictionary의 차이점은 set 안의 요소들은 그저 요소들의 배열이라면 dictionary는 안에 key : value 짝 데이터가 들어간다는 점이다.
set()으로 다른 자료형을 set 자료형으로 변환하기
list, string, tuple, dictionary를 set으로 변환할 수 있다. 이 때 중복되는 요소는 하나를 제외하고 모두 제거한다.
print(set('letters'))
{'e', 't', 'r', 's', 'l'}
위 예제에서 볼 수 있듯, 위 단어에는 e와 t가 각자 두 번씩 반복되는데, set()의 인자로 들어가면 오로지 하나만 포함한다.
위 예제에서도 볼 수 있듯, set에는 요소들의 순서가 무작위이다.
dictionary를 set() 인자로 대입하면 dictionary의 key만을 set에 포함시킨다.
some_dict = {'물': '목말라', '불': '추워', '이불': '밖은 위험해'}
print(set(some_dict))
{'이불', '물', '불'}
in 키워드로 값 테스트하기
다음의 dictionary를 가정해보겠다
my_recipe = {
'팽이버섯덮밥': {'팽이버섯', '밥', '양파', '굴소스', '간장', '올리고당', '달걀'},
'간장계란볶음밥': {'밥', '간장', '달걀'},
'야채볶음밥': {'햄', '밥', '당근', '양파'},
'부대찌개': {'햄', '당면', '라면', '두부'},
'김치찌개': {'김치', '돼지고기', '두부'}
}
레시피 중 밥이 들어가는 음식을 알고 싶다면?
for name, contents in my_recipe.items():
if '밥' in contents:
print(name)
팽이버섯덮밥
간장계란볶음밥
야채볶음밥
for, if, or와 같은 키워드는 다른 장에서 다룰 것이다.
밥은 넣었으면 하는데, 햄과 당근은 별로 먹고 싶지 않다면?
for name, contents in my_recipe.items():
if '밥' in contents and not ('햄' in contents or '당근' in contents):
print(name)
팽이버섯덮밥
간장계란볶음밥
즉 set에도 in 키워드를 사용하여 해당 요소가 set 안에 있는지 확인할 수 있다.
관련 연산자들
set에는 집합에서 쓰이는 개념들을 관련 함수들을 이용하여 구현할 수 있다.
(예제3-1에서 계속)
morning = my_recipe['팽이버섯덮밥']
dinner = my_recipe['야채볶음밥']
print(morning & dinner)
print(morning.intersection(dinner))
{'밥', '양파'}
{'밥', '양파'}
& 또는 intersection() 함수는 두 집합 간 교집합을 반환한다. 결과값의 자료형은 set이다.
print(morning | dinner)
print(morning.union(dinner))
{'양파', '팽이버섯', '밥', '올리고당', '간장', '당근', '햄', '굴소스', '달걀'}
{'양파', '팽이버섯', '밥', '올리고당', '간장', '당근', '햄', '굴소스', '달걀'}
또는 union() 함수는 합집합을 반환한다. |
print(morning - dinner)
print(morning.difference(dinner))
print(dinner - morning)
print(dinner.difference(morning))
{'팽이버섯', '올리고당', '달걀', '굴소스', '간장'}
{'팽이버섯', '올리고당', '달걀', '굴소스', '간장'}
{'당근', '햄'}
{'당근', '햄'}
- 또는 difference() 함수는 차집합을 반환한다. 즉, 첫 집합 내 요소들 중 두 번째 요소들을 뺀 요소들의 set을 반환한다.
print(morning ^ dinner)
print(morning.symmetric_difference(dinner))
{'팽이버섯', '올리고당', '간장', '당근', '햄', '굴소스', '달걀'}
{'팽이버섯', '올리고당', '간장', '당근', '햄', '굴소스', '달걀'}
^ 또는 symmetric_difference() 함수는 두 집합 중 한 집합에만 존재하는 요소들의 집합을 반환한다.
좀 더 수학적으로 표현하자면, 집합 A, B에 대해
\[(A \cup B ) - (A \cap B)\]
을 반환한다.
a = {1, 2, 3}
b = {1, 2, 3, 4}
print(a <= b)
print(a.issubset(b))
True
True
<= 또는 issubset() 함수는 첫 번째 집합이 두 번째 집합의 부분집합인지를 확인해준다. 반환값의 자료형은 boolean이다.
a = {1, 2, 3}
b = {1, 2, 3, 4}
print(a < b)
print(a < a)
True
False
진부분집합(proper subset)은 자기 자신을 제외한 부분집합이다. 두 번째 집합이 첫째 집합 내의 모든 요소를 가져야 하고 또 그보다 더 많은 요소를 가져야 한다.
한편 > 기호를 이용하여 proper superset인지를 확인하는 것도 가능하다.
a = {1, 2, 3}
b = {1, 2, 3, 4}
print(a <= b)
print(a.issubset(b))
print(a >= b)
print(a.issuperset(b))
True
True
False
False
superset은 부분집합의 반대 개념이다. >= 또는 issuperset() 함수를 이용하여 첫 째 집합이 두번째 집합의 superset인지 확인할 수 있다.
Reference
[1] Bill Lubannovic, “Introducing Python”, (O’REILLY, 2015)
This content is licensed under
CC BY-NC 4.0
댓글남기기