Mô tả bài toán
Cho Series: [14, 16, 30, 49, 80].
Yêu cầu: Lọc các số chính phương (perfect square). Kết quả: 16, 49 (và 4 nếu có trong dữ liệu).
Giải pháp 1: Kiểm tra căn bậc 2 nguyên (cách gốc)
Số n là chính phương nếu int(sqrt(n) + 0.5)**2 == n.
import pandas as pd
import math as m
l = [14, 16, 30, 49, 80]
data = pd.Series(l)
print("Series gốc:")
print(data)
# Lambda filter
result = pd.Series(filter(lambda x: x == int(m.sqrt(x) + 0.5)**2, l))
print("\nSố chính phương (filter lambda):")
print(data[data.isin(result)])
Giải pháp 2: Vòng lặp nhồng (cách gốc - không hiệu quả)
import pandas as pd
import math as m
l = [4, 16, 30, 49, 80]
data = pd.Series(l)
lis = []
for i in range(len(data)):
for j in data: # Vòng lặp nhồng không cần thiết
if data[i] == int(m.sqrt(j) + 0.5)**2:
lis.append(data[i])
print(data[data.isin(lis)])
Giải pháp 3: Vector hóa (khuyên dùng)
import pandas as pd
import numpy as np
data = pd.Series([14, 16, 30, 49, 80, 4, 100])
# Tính căn bậc 2, làm tròn, bình phương so sánh
sqrt_vals = np.sqrt(data)
is_perfect_square = (sqrt_vals == sqrt_vals.astype(int))
result = data[is_perfect_square]
print("Số chính phương:")
print(result)
# Hoặc dùng math.isqrt (Python 3.8+)
import math
mask = data.apply(lambda x: math.isqrt(x)**2 == x if x >= 0 else False)
print(data[mask])
Đầu ra
Series gốc: 0 14 1 16 2 30 3 49 4 80 dtype: int64 Số chính phương: 1 16 3 49 dtype: int64
So sánh phương pháp
| Phương pháp | Độ phức tạp | Xử lý số âm | Hiệu năng |
|---|---|---|---|
| lambda + math.sqrt | O(n) | Cần check >=0 | Trung bình |
| numpy vector hóa | O(n) | Tự động (NaN) | Cao |
| math.isqrt (Py 3.8+) | O(n) | Cần check >=0 | Cao, chính xác |
Khuyên dùng: math.isqrt (Python 3.8+) hoặc numpy vector hóa cho hiệu năng và độ chính xác tốt nhất.