본문 바로가기

Python

05_셋

05_셋


- 셋(set)은 값은 버리고 키만 남은 딕셔너리와 같다. 딕셔너리와 마찬가지로 각 키는 유일해야 하며, 존재하는지 여부만 판단하기 위해 사용한다.


셋 생성하기 : set()

- 셋을 생성할 때는 set() 함수 혹은 중괄호 안에 콤마로 구분된 하나 이상의 값을 넣으면 된다.

1
2
3
4
5
empty_set = set()
print(empty_set)
 
example_set = {012345}
print(example_set)
cs

데이터 타입 변환가기 : set()

- 리스트, 문자열, 튜플, 딕셔너리로부터 중복된 값을 버린 셋을 생성할 수 있다.

1
2
test_set = set('letters')
print(test_set)
cs

- letters 에 'e'와 't' 가 두 개씩 있어도, 셋에는 이 문자들이 하나씩 포함되어 있다.


in으로 값 멤버십 테스트하기

- 이것은 일반적으로 사용되는 셋의 용도이다. drinks 라는 딕셔너리를 만들어보자. 각 키는 음료의 이름이고, 값은 음료에 필요한 재료들의 셋이다. 해당 딕셔너리에서 vodka가 포함된 음료를 찾아보자.

1
2
3
4
5
6
7
8
9
10
11
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
 
for name, contents in drinks.items():
    if 'vodka' in contents:
        print(name)
cs


콤비네이션과 연산자

- 셋값의 콤비네이션(조합)을 어떻게 확인할까? 오렌지 주스(orange juice) 또는 버몬트(vermouth)가 들어가 있는 음료를 골라내려고 할 때, 셋 인터섹션 연산자(&)를 사용하자.

1
2
3
4
5
6
7
8
9
10
11
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
 
for name, contents in drinks.items():
    if contents & { 'vermouth''orange juice' }:
        print(name)
cs

- & 연산자의 결과는 우리가 비교하고자 했던 두 재료의 모든 항목이 포함된 셋이다. 원하는 값이 없다면, &은 False로 간주되는 빈 셋을 반환한다.


1. 교집합 구하기 - 인터섹션

& 연산자 및 intersection 함수 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
test1 = bruss & wruss
test2 = bruss.intersection(wruss)
print(test1)
print(test2)
cs


2. 합집합 구하기 - 유니온

| 연산자 및 union 함수 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
test1 = bruss | wruss
test2 = bruss.union(wruss)
print(test1)
print(test2)
cs


3. 차집합 구하기 - 디퍼런스

- 연산자 및 difference 함수 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
test1 = wruss - bruss
test2 = wruss.difference(bruss)
print(test1)
print(test2)
cs


4. 대칭차집합 구하기 - 익스클루시브

- 한쪽 셋에는 들어 있지만 양쪽 모두에 들어 잇는 않은 멤버 구할 때 사용

^ 연산자 및 symmetric_difference 함수 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
test1 = bruss ^ wruss
test2 = bruss.symmetric_difference(wruss)
print(test1)
print(test2)
cs


5. 부분 집합

- 하위인지 체크하는 서브셋은 <= 연산자 또는 issubset() 함수를 사용하고, 상위인지 체크하는 슈퍼셋은 >= 연산자 또는 issuperset() 함수를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
# bruss가 wruss의 서브셋인지 확인
test1 = bruss <= wruss
test2 = bruss.issubset(wruss)
print(test1)
print(test2)
 
# wruss가 bruss의 슈퍼셋인지 확인
test3 = wruss >= wruss
test4 = wruss.issuperset(bruss)
print(test3)
print(test4)
cs


6. 진 부분 집합

- 첫번째 셋이 두번째 셋의 프로퍼 서브셋이 되려면, 두번재 셋에는 첫번째 셋의 모든 멤버를 포함한 그 이상의 멤버가 되어야 한다.( 두번째 멤버가 첫번째 멤버를 포함 ), 첫번째 셋이 두번째 셋의 프로퍼 슈퍼셋이 되려면, 첫번째 셋이 두번째의 모든 멤버를 포함해야 한다.

- 프로퍼 서브셋은 < 연산자로, 프로퍼 슈퍼셋은 > 연산자로 확인 가능하다.

- 모든 셋은 자신의 프로퍼 슈퍼셋이 될 수 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
drinks =     {
            'martini' : { 'vodka''vermouth' },
            'black russian' : { 'vodka''kahlua' },
            'white russian' : { 'cream''kahlua''vodka' },
            'manhattan' : { 'cream''kahlua''vodka' },
            'crewdriver' : { 'orange juice''vodka' }
            }
            
bruss = drinks['black russian']
wruss = drinks['white russian']
 
# 프로퍼 서브셋인지 확인
print(bruss < wruss)
 
# 프로퍼 슈버셋인지 확인
print(wruss > bruss)
cs


'Python' 카테고리의 다른 글

04_딕셔너리  (0) 2018.01.20
03_튜플  (0) 2017.12.30
02_리스트  (0) 2017.12.17
01_파이 재료 : 숫자, 문자열, 변수  (0) 2017.12.10
00_Python 시작하기(설치)  (0) 2017.11.15