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

กำหนด ID ให้ค่าที่ไม่ซ้ำในลิสต์ Python (รักษาลำดับ)

ภาพรวม

บทความสอน 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]