집합론

효율적인 Python 코드 작성

Logan Thomas

Scientific Software Technical Trainer, Enthought

집합론

  • 객체의 모음을 다루는 수학의 한 분야
    • 예: sets
  • Python에는 메서드가 포함된 내장 set 자료형이 있습니다:
    • intersection(): 두 집합 모두에 있는 원소
    • difference(): 한 집합에는 있고 다른 집합에는 없는 원소
    • symmetric_difference(): 정확히 한 집합에만 있는 원소
    • union(): 두 집합 중 어느 하나에 있는 모든 원소
  • 빠른 멤버십 테스트
    • 시퀀스에 값 존재 여부 확인
    • in 연산자 사용
효율적인 Python 코드 작성

반복문으로 객체 비교

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']

alt=”리스트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 리스트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음”

효율적인 Python 코드 작성

반복문으로 객체 비교

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 

alt=”리스트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 리스트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음; 두 상자에서 Squirtle이 동그라미로 표시됨”

효율적인 Python 코드 작성
list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 
in_common = []

for pokemon_a in list_a:
    for pokemon_b in list_b:
        if pokemon_a == pokemon_b:
            in_common.append(pokemon_a)

print(in_common)
['Squirtle']
효율적인 Python 코드 작성
list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle'] 
set_a = set(list_a)
print(set_a)
{'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = set(list_b)
print(set_b)
{'Caterpie', 'Pidgey', 'Squirtle'}
set_a.intersection(set_b)
{'Squirtle'}
효율적인 Python 코드 작성

집합으로 효율성 향상

%%timeit
in_common = []

for pokemon_a in list_a:
    for pokemon_b in list_b:
        if pokemon_a == pokemon_b:
            in_common.append(pokemon_a)
601 ns ± 17.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit in_common = set_a.intersection(set_b)
137 ns ± 3.01 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
효율적인 Python 코드 작성

집합 메서드: difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.difference(set_b)
{'Bulbasaur', 'Charmander'}

alt=”세트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 세트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음; 세트 A 상자에서 Bulbasaur와 Charmander가 동그라미로 표시됨”

효율적인 Python 코드 작성

집합 메서드: difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_b.difference(set_a)
{'Caterpie', 'Pidgey'}

alt=”세트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 세트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음; 세트 B 상자에서 Caterpie와 Pidgey가 동그라미로 표시됨”

효율적인 Python 코드 작성

집합 메서드: symmetric_difference

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.symmetric_difference(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey'}

alt=”세트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 세트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음; Bulbasaur, Charmander, Caterpie, Pidgey가 동그라미로 표시됨”

효율적인 Python 코드 작성

집합 메서드: union

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.union(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey', 'Squirtle'}

alt=”세트 A 상자에는 Bulbasaur, Charmander, Squirtle 포켓몬이 있고, 세트 B 상자에는 Caterpie, Pidgey, Squirtle 포켓몬이 있음; 모든 포켓몬이 동그라미로 표시되며 Squirtle은 한 번만 표시됨”

효율적인 Python 코드 작성

세트로 멤버십 테스트

# 각 자료구조에 같은 720개의 포켓몬
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Abomasnow, Abra, Absol 포켓몬이 각각 리스트, 튜플, 세트라고 표시된 세 개의 상자에 담겨 있음”

효율적인 Python 코드 작성

세트로 멤버십 테스트

# 각 자료구조에 같은 720개의 포켓몬
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Abomasnow, Abra, Absol 포켓몬이 리스트, 튜플, 세트 상자에 각각 있음; Zubat 포켓몬에서 각 상자로 선이 그려져 멤버십 테스트를 나타냄”

효율적인 Python 코드 작성
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}
%timeit 'Zubat' in names_list
7.63 µs ± 211 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit 'Zubat' in names_tuple
7.6 µs ± 394 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit 'Zubat' in names_set
37.5 ns ± 1.37 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
효율적인 Python 코드 작성

세트로 고유값 구하기

# 각 포켓몬에 대응하는 720개의 기본 타입
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types = []

for prim_type in primary_types:
    if prim_type not in unique_types:
        unique_types.append(prim_type)

print(unique_types)
['Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
 'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
 'Ground', 'Ghost', 'Fighting', 'Flying']
효율적인 Python 코드 작성

세트로 고유값 구하기

# 각 포켓몬에 대응하는 720개의 기본 타입
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types_set = set(primary_types)
print(unique_types_set)
{'Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
 'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
 'Ground', 'Ghost', 'Fighting', 'Flying'}
효율적인 Python 코드 작성

집합론을 연습해 봅시다!

효율적인 Python 코드 작성

Preparing Video For Download...