บทนำ
เมื่อมี tuple ที่แต่ละ element เป็นลิสต์ และต้องการลบลิสต์ที่ซ้ำกันออกไปพร้อมรักษาลำดับเดิม สามารถใช้ set ช่วยจำค่าที่เคยเจอ ร่วมกับ list comprehension
ตัวอย่างโค้ด
my_tuple = ([1, 21, 34], [11, 0, 98], [45, 67, 56])
print("Tuple เดิม:", my_tuple)
# ใช้ set เก็บ tuple version ของลิสต์ที่เคยเจอ
seen = set()
result = [lst for lst in my_tuple
if not (tuple(lst) in seen or seen.add(tuple(lst)))]
print("หลังลบซ้ำ (รักษาลำดับ):", result)
ผลลัพธ์
Tuple เดิม: ([1, 21, 34], [11, 0, 98], [45, 67, 56]) หลังลบซ้ำ (รักษาลำดับ): [[1, 21, 34], [11, 0, 98], [45, 67, 56]]
คำอธิบาย
- ลิสต์ไม่สามารถใส่ใน set ได้โดยตรง (unhashable) ต้องแปลงเป็น tuple ก่อนด้วย
tuple(lst) seen.add(tuple(lst))คืนค่าNoneซึ่งเป็น False ใน boolean contextnot (A or B)ทำงานแบบ short-circuit: ถ้า A จริง (เจอแล้ว) → False → ไม่เอา; ถ้า A เท็จ → ตรวจสอบ B (add เข้า set) → None → False → not False = True → เอา
วิธีอ่านง่ายกว่า
seen = set()
result = []
for lst in my_tuple:
tup_version = tuple(lst)
if tup_version not in seen:
seen.add(tup_version)
result.append(lst)
print(result)