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

Python: ดึงองค์ประกอบจากลิสต์ที่อยู่ในเซต (Filter List by Set)

บทนำ

โจทย์: จากลิสต์หลัก กรองเอาเฉพาะองค์ประกอบที่อยู่ในเซตที่กำหนด (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

✅ ใช้ 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 ได้ตามต้องการ

ContainerMembership Test (x in container)Complexity
SetO(1) averageHash table
ListO(n)Linear search
Dict keysO(1) averageHash table