Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lọc số chính phương (perfect square) trong Series Python

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ạpXử lý số âmHiệu năng
lambda + math.sqrtO(n)Cần check >=0Trung bình
numpy vector hóaO(n)Tự động (NaN)Cao
math.isqrt (Py 3.8+)O(n)Cần check >=0Cao, 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.