
set은 중복되지 않은 요소들의 집합이다.
순서가 없는 자료형이다! (다만 iterable하기 때문에 반복문은 가능하다..)
또한, 순서가 없다.
set을 만드는 방법에는 2가지가 있다.
1) set() 이용
str_set2 = set('abc')
print(str_set2) #{'c','b','a'}
set을 이용하면 요소 하나하나 다 분리되어진다.
2) {} 이용
str_set1={'abc'} # {'abc'}
{}를 이용하면, set 안 요소는 쉼표로 구분된다.
참고로 set 안에 set을 넣는 것은 불가능하다...
아까 set에는 순서가 없다했다. 따라서 인덱스를 통한 데이터 조회는 불가능하다.
따라서 데이터의 여부를 물어보는 in 연산자를 이용한다!
prac_set = {1,2,3,4,5}
print(6 in prac_set) # False
데이터는 .add() 또는 update를 이용해서 추가한다.
prac_set.add(8) # prac_set={1,2,3,4,5,8}
prac_set.update(8) #에러!!
add는 다음과 같이 파라미터에 뭐가 들어가도 추가가 되지만,
update는 iterable한 객체가 들어가야 한다.
iterable하다란?
prac_set.update((6)) #불가능
prac_set.update((6,3)) #가능
prac_set.update({8}) #가능
prac_set.update({'0':0}) # '0'만 추가
다음과 같이 update로 올 수 있는 iterble한 객체는
튜플(원소 2개 이상) , 딕셔너리(키만 추가됨), set 이 있다.
remove(value) , discard 두 종류가 있다.
prac_set = {1,2,3,4}
prac_set.remove(4) # {1,2,3}
prac_set.remove(6) # 에러!!
prac_set.discard(8) #에러 안남
딕셔너리의 dict[key], dict.get(key) 와 유사하게,
실제로 데이터가 존재하느냐 아니냐에 따라 에러 유무가 달라진다.
데이터가 삭제가 되어야만 다음 로직이 실행되는 경우, discard보다는 remove를 쓰도록 하자
clear()를 사용하면 싹 다 날려버릴 수 있다.
prac_set.clear()
print(super_set) # set()
집합 여러개는 합집합, 교집합, 차집합, 여집합 등 다양한 연산이 가능한데,
python의 집합도 마찬가지다.
feature_set1 = set([1,2,3,4,5])
feature_set2 = set([4,5,6,7,8])
다음과 같은 두 집합이 있을 때 예시들을 보겠다.
print(feature_set.union(feature_set2))
print(feature_set1 | feature_set2)
# 출력결과 1,2,3,4,5,6,7,8
print(feature_set1.difference(feature_set2))
print(feature_set1-feature_set2)
참고로 차집합은 뒤에 오는 피연산자를 없애는 것이므로, 연산 순서에 따라 결과가 달라진다.
print(feature_set1.intersection(feature_set2))
print(feature_set1 & feature_set2)
A가 B의 부분집합인지, 상위 집합인지 판별할 수 있다.
sub_set = {1,2}
supra_set={1,2,3,4}
print(supre_set.issubset(sub_set)) #False
print(sub_set.issuperset(sub_set)) # True
>, < 같은 부등호로도 표현이 가능하다!
print(sub_set > supra_set ) #Fasle
#sub_set이 더 상위 집합인가?
겹치는게 있는지 반환해주는 isdisjoint도 사용이 가능하다.
print(sub_set.isdisjoint(supra_set)) # Fasle