บทนำ
โจทย์: จากลิสต์หลัก สร้างลิสต์ mask (0/1) บ่งบอกว่าแต่ละองค์ประกอบปรากฏในลิสต์อ้างอิงหรือไม่ ใช้ list comprehension
ตัวอย่างโค้ด
my_list = [5, 6, 1, 9, 11, 0, 4]
search_list = [2, 10, 6, 3, 9]
print(f"ลิสต์หลัก: {my_list}")
print(f"ลิสต์อ้างอิง: {search_list}")
# List comprehension: 1 ถ้าอยู่ใน search_list, 0 ถ้าไม่อยู่
mask = [1 if elem in search_list else 0 for elem in my_list]
print(f"Mask: {mask}")
ผลลัพธ์
ลิสต์หลัก: [5, 6, 1, 9, 11, 0, 4]
ลิสต์อ้างอิง: [2, 10, 6, 3, 9]
Mask: [0, 1, 0, 1, 0, 0, 0]
คำอธิบาย
Element: 5 6 1 9 11 0 4
In ref? N Y N Y N N N
Mask: 0 1 0 1 0 0 0
ปรับปรุงประสิทธิภาพ: แปลง search_list เป็น Set
# ❌ ช้า: O(n) ต่อการค้นหาใน list
mask = [1 if elem in search_list else 0 for elem in my_list]
# ✅ เร็ว: O(1) ต่อการค้นหาใน set
search_set = set(search_list)
mask = [1 if elem in search_set else 0 for elem in my_list]
ฟังก์ชันครบถ้วน
def create_mask(source_list, reference_list, true_val=1, false_val=0):
"""สร้าง binary mask จาก reference list"""
ref_set = set(reference_list)
return [true_val if x in ref_set else false_val for x in source_list]
# ทดสอบ
print(create_mask([5,6,1,9,11,0,4], [2,10,6,3,9])) # [0,1,0,1,0,0,0]
print(create_mask(['a','b','c'], ['b','c'], True, False)) # [False, True, True]
print(create_mask([1,2,3], [2], 'Y', 'N')) # ['N', 'Y', 'N']
การประยุกต์: Boolean Mask สำหรับ NumPy/Pandas
import numpy as np
import pandas as pd
arr = np.array([5, 6, 1, 9, 11, 0, 4])
ref = {2, 10, 6, 3, 9}
# NumPy boolean mask
mask = np.isin(arr, list(ref))
print(arr[mask]) # [6 9]
# Pandas Series
s = pd.Series([5, 6, 1, 9, 11, 0, 4])
print(s[s.isin(ref)].tolist()) # [6, 9]
สรุป
ใช้ list comprehension [1 if x in ref_set else 0 for x in lst] สร้าง binary mask ได้อย่างกระชับ สำคัญ: แปลง reference list เป็น set ก่อนเพื่อประสิทธิภาพ O(1) lookup