Теорія множин

Ефективне написання коду 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']

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «List A», а Caterpie, Pidgey і Squirtle — в окремій рамці «List B»"

Ефективне написання коду Python

Порівняння об'єктів циклами

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

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «List A» та Caterpie, Pidgey і Squirtle в окремій рамці «List B»; 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'}

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «Set A» та Caterpie, Pidgey і Squirtle в окремій рамці «Set B»; у рамці «Set A» обведено Bulbasaur і Charmander"

Ефективне написання коду Python

Метод множин: difference

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

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «Set A» та Caterpie, Pidgey і Squirtle в окремій рамці «Set B»; у рамці «Set 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'}

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «Set A» та Caterpie, Pidgey і Squirtle в окремій рамці «Set B»; обведено 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'}

альт="Покемони Bulbasaur, Charmander і Squirtle в рамці «Set A» та Caterpie, Pidgey і Squirtle в окремій рамці «Set B»; обведено всіх покемонів, Squirtle лише один раз"

Ефективне написання коду Python

Перевірка належності у множинах

# Ті самі 720 покемонів у кожній структурі даних
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

альт="Покемони Abomasnow, Abra та Absol у трьох окремих рамках із назвами відповідно «List», «Tuple» і «Set»"

Ефективне написання коду Python

Перевірка належності у множинах

# Ті самі 720 покемонів у кожній структурі даних
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

альт="Покемони Abomasnow, Abra та Absol у трьох окремих рамках із назвами «List», «Tuple» і «Set»; покемон 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...