3.5 셋

셋(set)은 값은 버리고 키만 남은 딕셔너리와 같다

3.5.1 셋 생성하기: set()

empty_set = set()
empty_set

set()

even_numbers = {0, 2, 4, 6, 8}
even_numbers

{0, 2, 4, 6, 8}

odd_numbers = {1, 3, 5, 7, 9}
odd_numbers

{1, 3, 5, 7, 9}

{}는 빈셋을 생성하는 것이 아니라 빈 딕셔너리를 생성한다. {}대신 set()을 출력한다. 이미 파이썬에서 딕셔너리가 {}를 가지고 있기 때문이다.

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

set('letters')

{‘e’, ‘l’, ‘r’, ‘s’, ‘t’}

set(['Dahser', 'Dancer', 'Prancer', 'Mason-Dixon'])

{‘Dahser’, ‘Dancer’, ‘Mason-Dixon’, ‘Prancer’}

set(('Ummagumma', 'Echoes', 'Atom Hear Mohter'))

{‘Atom Hear Mohter’, ‘Echoes’, ‘Ummagumma’}

set({'apple' : 'red' , 'orange': 'orange', 'cherry': 'red'})

{‘apple’, ‘cherry’, ‘orange’}

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

drinks = {
'martini': {'vodka', 'vermouth'},
'black russian': {'vodka', 'kahlua'},
'white russian': {'cream', 'kahlua', 'vodka'},
'manhattan': {'rye', 'vermouth', 'vodka'},
'screwdriver': {'orange juice', 'vodka'}
}
for name, contents in drinks.items():
if 'vodka' in contents:
print(name)

martini black russian white russian manhattan screwdriver

for name, contents in drinks.items():
if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
print(name)

black russian screwdriver

3.5.4 콤비네이션과 연산자

for name, contents in drinks.items():
if contents & {'vermouth', 'orange juice'}:
print(name)

martini manhattan screwdriver

for name, contents in drinks.items():
if 'vodka' in contents and not contents & {'vermouth', 'cream'}:
print(name)

black russian screwdriver

bruss = drinks['black russian']
wruss = drinks['white russian']
a = {1,2}
b = {2,3}
  • & 연산자와 intersection() 함수를 이용하여 교집합(양쪽 셋에 모두 들어 있는 멤버)를 구함
    a & b
    

    {2}

    a.intersection(b)
    

    {2}

    bruss & wruss
    

    {‘kahlua’, ‘vodka’}

  • | 연산자와 union() 함수를 이용하여 합집합(각 셋에 멤버 모두)를 구함
    a | b
    

    {1, 2, 3}

    a.union(b)
    

    {1, 2, 3}

    bruss | wruss
    

    {‘cream’, ‘kahlua’, ‘vodka’}

    bruss.union(wruss)
    

    {‘cream’, ‘kahlua’, ‘vodka’}

  • - 연산자와 difference() 함수를 이용하여 차집합(첫 번째 셋에는 있지만 두 번째 셋에는 없는 멤버)을 구함
    a - b
    

    {1}

    a.difference(b)
    

    {1}

    bruss - wruss
    

    set()

    wruss - bruss
    

    {‘cream’}

  • ^ 연산자나 symmetric_difference() 함수를 이용하여 대칭 차집합(한쪽 셋에는 들어 있지만 양쪽 모두에 들어 있지 않은 멤버)을 구함
    a ^ b
    

    {1, 3}

    a.symmetric_difference(b)
    

    {1, 3}

    bruss ^ wruss
    

    {‘cream’}

  • <= 연산자나 issubset() 함수를 이용하여 첫 번째 셋이 두번째 셋의 부분집합 인지 구함
    a <= b
    

    False

    a.issubset(b)
    

    False

    bruss <= wruss
    

    True

    블랙 러시안에 크림을 추가 하면 화이트 러시안이 된다 그래서 wruss는 bruss의 상위 집합 이다

a <= a

True

a.issubset(a)

True

bruss <= bruss

True

모든 셋은 자신의 서브셋이다

  • 첫 번째 셋이 두 번째 셋의 진부분집합이 되러면, 두 번째 셋에는 첫번째 셋의 모든 멤버를 포함한 그 이상의 멤버가 있어야 한다. < 연산자를 사용해서 구함.
    a < b
    

    False

    a < a
    

    False

    bruss < wruss
    

    True

  • 슈퍼셋은 서브셋(부분집합)의 반대다. >=연산자나 issuperset() 함수를 이용하여 첫 번째 셋이 두 번째 셋의 슈퍼셋인지 구함.
    a >= b
    

    False

    a.issuperset(b)
    

    False

    wruss >= bruss
    

    True

    a >= a
    

    True

    a.issuperset(a)
    

    True

    모든 셋은 자신의 슈퍼셋이다.

  • 마지막으로 > 연산자를 사용하여 첫 번째 셋이 두 번째 셋의 진상위집합 인지 확인해봄.
    첫 번째 셋이 두번쨰 셋의 진상위집합이 되려면, 첫 번째 셋에는 두 번째 셋의 모든 멤버를 포함한 그 이상의 멤버가 있어야 한다.
a > b

False

wruss > bruss

True

a  > a

False

모든 셋은 자신의 진상위집합이 될 수 없다.

Comments