บทนำ
โจทย์: จากลิสต์หลัก กรองเอาเฉพาะองค์ประกอบที่อยู่ในเซตที่กำหนด (membership test) คงลำดับและจำนวนครั้งที่ปรากฏ (preserve duplicates)
ตัวอย่างโค้ด
my_list = [5, 7, 2, 7, 2, 4, 9, 8, 8]
search_set = {6, 2, 8}
print(f"ลิสต์ต้นทาง: {my_list}")
print(f"เซตค้นหา: {search_set}")
# วนลูปตรวจสอบ membership
result = []
for elem in my_list:
if elem in search_set:
result.append(elem)
print(f"ผลลัพธ์: {result}")
ผลลัพธ์
ลิสต์ต้นทาง: [5, 7, 2, 7, 2, 4, 9, 8, 8]
เซตค้นหา: {6, 2, 8}
ผลลัพธ์: [2, 2, 8, 8]
วิธีที่ Pythonic กว่า: List Comprehension
result = [elem for elem in my_list if elem in search_set]
print(result) # [2, 2, 8, 8]
ประสิทธิภาพ: Set vs List สำหรับ Membership Test
| Container | Membership Test (x in container) | Complexity |
| Set | O(1) average | Hash table |
| List | O(n) | Linear search |
| Dict keys | O(1) average | Hash table |
✅ ใช้ set สำหรับ search_set เพื่อประสิทธิภาพ O(1) ต่อการค้นหา
กรณีใช้งานจริง
- กรองข้อมูลตาม whitelist/blacklist
- เลือก features ที่ต้องการจาก feature set
- Validate input values ต่อ allowed values
ฟังก์ชันครบถ้วน
def filter_by_set(lst, allowed_set, keep_order=True, unique=False):
"""กรองลิสต์ด้วยเซต
Args:
lst: ลิสต์ต้นทาง
allowed_set: เซตของค่าที่อนุญาต
keep_order: True = คงลำดับ, False = เรียงลำดับ
unique: True = ลบซ้ำ, False = เก็บทุกครั้ง
"""
if unique:
seen = set()
result = []
for elem in lst:
if elem in allowed_set and elem not in seen:
result.append(elem)
seen.add(elem)
return result
else:
return [elem for elem in lst if elem in allowed_set]
# ทดสอบ
print(filter_by_set(my_list, search_set)) # [2, 2, 8, 8]
print(filter_by_set(my_list, search_set, unique=True)) # [2, 8]
Pandas Series: isin()
import pandas as pd
s = pd.Series([5, 7, 2, 7, 2, 4, 9, 8, 8])
result = s[s.isin({6, 2, 8})]
print(result.tolist()) # [2, 2, 8, 8]
สรุป
ใช้ list comprehension [x for x in lst if x in allowed_set] พร้อม allowed_set เป็น set เพื่อ O(1) membership test คงลำดับและ duplicates ได้ตามต้องการ