ภาพรวม
บทความสอน 2 วิธีกำหนด ID ให้ค่าที่ไม่ซ้ำในลิสต์ โดยค่าที่ซ้ำได้ ID เดียวกัน และ ID กำหนดตามลำดับที่เจอครั้งแรก (preserve order)
ตัวอย่างข้อมูล
Alist = ['Mon', 'Tue', 'Wed', 'Mon', 5, 3, 3]
ค่าที่ไม่ซ้ำตามลำดับ: Mon, Tue, Wed, 5, 3 → ID: 0,1,2,3,4
ผลลัพธ์: [0, 1, 2, 0, 3, 4, 4]
วิธี 1: enumerate + OrderedDict.fromkeys()
from collections import OrderedDict
Alist = ['Mon', 'Tue', 'Wed', 'Mon', 5, 3, 3]
id_map = {v: k for k, v in enumerate(OrderedDict.fromkeys(Alist))}
list_ids = [id_map[n] for n in Alist]
print(list_ids) # [0, 1, 2, 0, 3, 4, 4]
OrderedDict.fromkeys(Alist) ลบ duplicate รักษาลำดับ → enumerate ให้ ID
วิธี 2: defaultdict + lambda
from collections import defaultdict Alist = ['Mon', 'Tue', 'Wed', 'Mon', 5, 3, 3] d_dict = defaultdict(lambda: len(d_dict)) list_ids = [d_dict[n] for n in Alist] print(list_ids) # [0, 1, 2, 0, 3, 4, 4]
อธิบาย:
defaultdict(lambda: len(d_dict))เมื่อเจอ key ใหม่ จะสร้าง value = ขนาดปัจจุบันของ dict (0,1,2...)- key ที่เจอซ้ำจะคืนค่าเดิม
ข้อดีของวิธี 2
- One-pass: ไม่ต้องสร้าง id_map แยก
- ทำงานได้กับข้อมูล streaming (ไม่ต้องรู้ขนาดล่วงหน้า)
- โค้ดกระชับ
ผลลัพธ์
[0, 1, 2, 0, 3, 4, 4]