Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python: สร้าง Mask List จากลิสต์อีกชุด (Binary Mask)

บทนำ

โจทย์: จากลิสต์หลัก สร้างลิสต์ 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