[Python] Set

·2024년 3월 22일

set

set은 중복되지 않은 요소들의 집합이다.
순서가 없는 자료형이다! (다만 iterable하기 때문에 반복문은 가능하다..)
또한, 순서가 없다.

set을 만드는 방법에는 2가지가 있다.

set 생성

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])

다음과 같은 두 집합이 있을 때 예시들을 보겠다.

합집합 (union, |)

print(feature_set.union(feature_set2))
print(feature_set1 | feature_set2)
# 출력결과 1,2,3,4,5,6,7,8

차집합 (difference, -)

print(feature_set1.difference(feature_set2))
print(feature_set1-feature_set2)

참고로 차집합은 뒤에 오는 피연산자를 없애는 것이므로, 연산 순서에 따라 결과가 달라진다.

교집합 (intersection, &)

print(feature_set1.intersection(feature_set2))
print(feature_set1 & feature_set2)

부분집합 (issubset, issuperset, >, isdisjoint)

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
profile
풀스택 호소인

0개의 댓글