Lý thuyết tập hợp

Viết mã Python hiệu quả

Logan Thomas

Scientific Software Technical Trainer, Enthought

Lý thuyết tập hợp

  • Ngành Toán học áp dụng cho tập hợp đối tượng
    • tức là sets
  • Python có kiểu dữ liệu set tích hợp kèm các phương thức:
    • intersection(): phần tử có ở cả hai tập
    • difference(): phần tử có ở một tập nhưng không ở tập kia
    • symmetric_difference(): phần tử chỉ xuất hiện ở đúng một tập
    • union(): phần tử có ở ít nhất một tập
  • Kiểm tra thành viên nhanh
    • Kiểm tra một giá trị có trong chuỗi hay không
    • Dùng toán tử in
Viết mã Python hiệu quả

So sánh đối tượng bằng vòng lặp

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong khung tên Danh sách A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Danh sách B”

Viết mã Python hiệu quả

So sánh đối tượng bằng vòng lặp

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong khung tên Danh sách A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Danh sách B; Squirtle được khoanh tròn trong cả hai khung”

Viết mã Python hiệu quả
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']
Viết mã Python hiệu quả
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'}
Viết mã Python hiệu quả

Tối ưu với lý thuyết tập hợp

%%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/vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 1000000 vòng mỗi lần)
%timeit in_common = set_a.intersection(set_b)
137 ns ± 3.01 ns/vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000000 vòng mỗi lần)
Viết mã Python hiệu quả

Phương thức set: difference

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong một khung tên Tập A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Tập B; Bulbasaur và Charmander được khoanh tròn trong khung Tập A”

Viết mã Python hiệu quả

Phương thức set: difference

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong một khung tên Tập A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Tập B; Caterpie và Pidgey được khoanh tròn trong khung Tập B”

Viết mã Python hiệu quả

Phương thức set: symmetric difference

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong một khung tên Tập A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Tập B; Bulbasaur, Charmander, Caterpie và Pidgey được khoanh tròn”

Viết mã Python hiệu quả

Phương thức set: union

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

alt=”Các Pokémon Bulbasaur, Charmander và Squirtle trong một khung tên Tập A và các Pokémon Caterpie, Pidgey và Squirtle trong khung khác tên Tập B; Tất cả Pokémon được khoanh, Squirtle chỉ khoanh một lần”

Viết mã Python hiệu quả

Kiểm tra thành viên với set

# Cùng 720 Pokémon trong mỗi cấu trúc dữ liệu
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Các Pokémon Abomasnow, Abra và Absol trong ba khung riêng, lần lượt tên Danh sách, Bộ và Tập”

Viết mã Python hiệu quả

Kiểm tra thành viên với set

# Cùng 720 Pokémon trong mỗi cấu trúc dữ liệu
names_list  = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set   = {'Abomasnow', 'Abra', 'Absol', ...}

alt=”Các Pokémon Abomasnow, Abra và Absol trong ba khung riêng tên Danh sách, Bộ và Tập; Pokémon Zubat có đường nối tới mỗi khung biểu diễn kiểm tra thành viên”

Viết mã Python hiệu quả
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/vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 100000 vòng mỗi lần)
%timeit 'Zubat' in names_tuple
7.6 µs ± 394 ns/vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 100000 vòng mỗi lần)
%timeit 'Zubat' in names_set
37.5 ns ± 1.37 ns/vòng (trung bình ± độ lệch chuẩn của 7 lần chạy, 10000000 vòng mỗi lần)
Viết mã Python hiệu quả

Giá trị duy nhất với set

# 720 hệ chính ứng với mỗi Pokémon
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']
Viết mã Python hiệu quả

Giá trị duy nhất với set

# 720 hệ chính ứng với mỗi Pokémon
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'}
Viết mã Python hiệu quả

Hãy luyện tập lý thuyết tập hợp!

Viết mã Python hiệu quả

Preparing Video For Download...