TIL

TIL. 20 set_조작하기_2

codermun 2020. 10. 28. 18:59
728x90
반응형

## 집합 연산 사용하기

## 합집합 (union)

## 합집합에서는 | 라는 기호를 사용하며 이 기호를 OR연산자라 부른다.

## 세트1 | 세트2 _구조 1

## set.union(세트1, 세트2) _구조 2

# 세트 1, 2를 더하세요

 

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

print(a | b)

print(set.union(a, b))

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

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


## 교집합(intersection)

## 교집합에서는 & 라는 기호를 사용하며 이 기호를 AND 연산자라 부른다.

## 세트1 & 세트2

## set.intersection(세트1, 세트2)

# 세트 1, 2 모두(중복) 들어있는 값을 구하세요

 

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

print(a & b)

print(set.intersection(a, b))

:: {3, 4}

{3, 4}


## 차집합(difference)

## 차집합에서는 - 라는 기호를 사용하며 이 기호를 뺴기 연산자라 부른다.

## 세트1 - 세트2

## set.difference(세트1, 세트2)

# 세트 1 에서 세트 2에 있는 값을 빼세요.

 

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

print(a - b)

print(set.difference(a, b))

:: {1, 2}

{1, 2}

print(b - a)

:: {5, 6}


## 대칭 차집합(symmertric_difference)

## 대칭 차집합에서는 ^ 라는 기호를 사용하며 XOR 연산자라 부른다 (BetaOR이라고도 부른다)

## 세트1 ^ 세트2

## set.symmetric_difference(세트1, 세트2)

 

## 대칭차집합 def == 한 집합에는 포함할 수 있지만 두 집합 전부에는 포함되지 않는 원소들의 집합.

## a = {1, 2, 3, 4} // b = {3, 4, 5, 6}

## a - b = {1, 2} // b - a = {5, 6}

## a, b의 차집합들 간의 합집합이라고 생가하면 된다 (a-b)U(b-a) == (a-b) | (b-a)

 

a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

 

print(a ^ b)

print(set.symmetric_difference(a, b))

:: {1, 2, 5, 6}

{1, 2, 5, 6}


## 집합 연산 사용 후 할당 연산자 사용하기

## set 자료형에 |, &, -, ^ 연산자=(할당연산자)를 함께 사용하면 집합 연산의 결과를 다시 변수에 할당한다.

## 집합 연산자와 할당연산자가 만나면 .update 메서드와 같은 역할을 수행한다.

 

## 합집합(union)

## 세트 1 과 세트 2를 더하고 재할당한다

## 세트1 |= 세트2

## 세트1.update(세트2)

 

a = {1, 2, 3, 4}

a |= {6}

print(a)

:: {1, 2, 3, 4, 6}

a.update({9}##union은 들어가지 않는다.

print(a)

:: {1, 2, 3, 4, 6, 9}

## 교집합(intersection)

## &= // 세트 1과 세트 2 의 겹치는 요소만으로 세트1에 재할당한다.

## 세트1 &= 세트2

## 세트1.intersection_update(세트2)

 

a = {1, 2, 3, 4}

a &= {0, 1, 3, 4, 5, 6}

print(a)

:: {1, 3, 4}

 

a.intersection_update({3, 4, 5})

print(a)

:: {3, 4}


## 차집합(difference)

## -= // 세트 1 에서 세트 2에 들어있는 값을 뺴고 세트1에 재할당한다.

## 세트1 -= 세트2

## 세트1.difference_update(세트2)

 

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

a -= {0, 4, 5, 6}

print(a)

:: {1, 2, 3}

 

a.difference_update({2, 4, 6})

print(a)

:: {1, 3}


## 대칭차집합(symmertric_difference)

## ^= // 세트 1와 세트 2에서 겹치지 않는 요소들로만 세트 1에 재할당한다.

## 세트1 ^= 세트2

## 세트1.symmetric_difference_update(세트2)

 

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

a ^= {0, 2, 4, 6, 8}

print(a)

:: {0, 1, 3, 5, 6, 8}

 

a.symmetric_difference_update({1, 3, 5, 7})

print(a)

:: {0, 6, 7, 8}

## 부분집합과 상위집합 확인하기

# set는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수 있다.

# 부등호 , 등호를 사용하여 표기 할 수 있다 (< , > , =)

# a가 b의 부분집합인지 / b가 a의 상위집합인지 속하는 관계를 확인하는 법으로 수학적으로 접근하면 이해하기 쉽다.

 

## 부분집합

## 현제세트가 다른 세트의 부분집합인지 확인하는 방법 및 메서드

## 현재세트 <= 다른세트

## 현재세트.issubset(다른세트)

## <= 와 .issubset() 동일하게 생각하자 // is_sub_set 연결해서 issubset

 

a = {1, 2, 3, 4}

print(a <= {1, 2, 3, 4})

print(a.issubset({1, 2, 3, 4}))

:: True

print(a <= {1, 2, 3, 4, 5})

:: True

print(a <= {1, 2, 3})

::False

 


## 진부분집합

## 현제세트가 다른 세트의 진부분집합인지 확인하는 방법, 별도 메서드 없음

## 현재세트 < 다른세트

## 진부분집합은 부분집합에서 자신과 동일한 것을 제외한 것을 진부분집합으로 이해 할 수 있다.

 

a = {1, 2, 3, 4}

print(a < {1, 2, 3, 4})

:: False ## 자신과 동일한 것은 진부분집합 관계가 아님

print(a < {1, 2, 3, 4, 5})

:: True

print(a < {1, 2, 3})

:: False


## 상위집합

## 현제세트가 다른 세트의 상위집합인지 확인하는 방법 및 메서드

## 현재세트 >= 다른세트

## 현재세트.issuperset(다른세트)

## >= 와 .issuperset() 동일하게 생각하자 // is_super_set 연결해서 issuperset

 

a = {1, 2, 3, 4}

print(a >= {1, 2, 3, 4})

print(a.issuperset({1, 2, 3, 4}))

:: True

print(a >= {1, 2, 3, 4, 5})

:: False

print(a >= {1, 2, 3})

:: True


## 진상위집합

## 현제세트가 다른 세트의 진상위집합인지 확인하는 방법, 별도 메서드 없음

## 현재세트 >= 다른세트

 

a = {1, 2, 3, 4}

print(a > {1, 2, 3, 4})

:: False

print(a > {1, 2, 3, 4, 5})

:: False

print(a > {1, 2, 3})

:: True

## set가 같은지 다른지 확인하기

## == 연산자를 이용해 확인 가능하다.

 

a = {1, 2, 3, 4}

print(a == {1, 2, 3, 4})

:: True

print(a == {3, 1, 2, 4})

:: True

## 요소의 순서가 없으므로 요소만 같다면 True


## != 연산자 이용 확인 가능

 

a = {1, 2, 3, 4}

print(a != {1, 2, 3, 4})

:: False ## 아니요 a는 {세트}와 다르지 않습니다 (같습니다)

 

print(a != {1, 2, 4})

:: True ## 네 a 는 {세트}와 다릅니다 (같지 않다)


## set가 겹치는지 확인하기

## 현제 세트와 다른세트가 "겹치지 않는지"를 확인한다. // 겹치지 않으면 True

## 현재세트.isdisjoint(다른세트)

 

a = {1, 2, 3, 4}

print(a.isdisjoint({1, 5, 6, 4}))

:: False ## 1, 4가 겹침

 

print(a.isdisjoint({5, 6, 7}))

# True ## 겹치지 않

## set 조작하기

 # add

# 세트에 요소 추가

 

a = {1, 2, 3}

a.add(5)

print(a)

:: {1, 2, 3, 5}


# remove

# 세트에서 특정 요소값을 삭제

 

a = {1, 2, 3, 4}

a.remove(3)

print(a)

:: {1, 2, 4}


## discard

# 세트에서 특정 요소값을 삭제

 

a = {1, 2, 3, 4}

a.discard(3)

print(a)

:: {1, 2, 4}

## a.remove(3)  ## set안에 3이라는 요소가 없는 상태이므로 error 발생

 a.discard(3)  ## set 안에 3이라는 요소가 없지만, error가 발생하지 않고 넘어감! _remove와 차이점

print(a)

:: {1, 2, 4}


# pop

# 세트에서 임의의 요소를 삭제함

 

b = {1, 2, 3, 4}

b.pop() # 1, 2, 3, 4 를 랜덤하게 삭제해야하는데 계속 맨 앞의 인덱스가 지워짐(숫자로만 이루어져있어 그런듯하다)


# clear

# 세트의 모든 요소 삭제

 

a = {1, 2, 3, 4}

a.clear()

print(a) # 다 삭제하면 빈 세트만 남음

:: set()


# len

# 세트의 길이를 구함

 

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

print(len(a))

:: 10 ## 10 이 중복되어있어 하나만 적용

## set 의 할당과 복사

## set 에서의 할당과 복사는 list와 동일하다 (2차원 list는 deepcopy 사용해야함)

 ## 할당

 

a = {1, 2, 3, 4}

b = a

 b.add(5)

print(a)

print(b)

:: {1, 2, 3, 4, 5}

## 세트 1개 변수 2개로 세트 1개를 부르는 이름만 다를뿐이다.

## 하나의 변수를 변경시 다른 변수도 동일하게 적용


## 복사

# .copy

 

a = {1, 2, 3, 4}

b = a.copy()

b.add(5)

print(a)

:: {1, 2, 3, 4}

print(b)

:: {1, 2, 3, 4, 5}

## 세트 2개 변수 2개

## 하나의 변수를 변경시 다른 변수는 영향을 받지 않음

## 반복문을 이용한 set 요소 출력하기

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

b = {'k', 'o', 'r', 'e', 'a'}

 

for i in a:

print(i, end=' ')

 

for i in b:

print(i , end=" ")

 

for i in {1, 2, 3, 4, 5}:

print(i)

 

## 반복문을 이용해 세트 요소를 출력할 수 있으며

## 원래 세트는 요소의 순서가 정해져있지 않지만, 숫자로만 구성되어 있다면 순서대로 출력이된다

## 위의 코드에서 숫자와 문자열의 경우 숫자는 1 2 3 4 5 가 일정하게 출력되고 문자열은 랜덤하게 출력된다.

## set 표현식 사용하기

## {식 for 변수 in 반복가능한객체} _ 추천

## set(식 for 변수 in 반복가능한객체)

a = {i for i in 'apple'}

print(a)

:: {'p', 'l', 'e', 'a'}

## 여기서 a p p l e를 꺼내오고 출력을하며 여기서 유일한문자(중복없는) a p l e 가 요소의 순서 없이 랜덤하게 출력된다.



## {식 for 변수 in 세트 if 조건식} _ 추천

## set(식 for 변수 in 세트 if 조건식)

a = {i for i in 'pineapple' if i not in 'apl'}

print(a)

:: {'n', 'e', 'i'}

## 먼저 'pineapple'에서 유일한 문자만을 뽑은뒤 if 조건문으로 검증한다.

## if i not in 'apl' 이란 뜻은 뽑아온 'pineapple'을 i에 라는 변수에 일일이 담아 i가 a p l 인지 아닌지 검증하고

## 아닌 경우에만 뽑아 사용하라는 의미이다.

c = {i for i in range(10) if i != 2 and i != 7}

print(c)

:: {0, 1, 3, 4, 5, 6, 8, 9}

## if i != 2 and i != 7 // 0 ~9 중 i 가 2가 아니고 , 7이 아닐경우 값을 넘겨줘라 라는 의미.

728x90
반응형