Kodokon kodokon.com

คอมพรีเฮนชันของลิสต์และดิกชันนารี

แทนที่ลูปสร้างข้อมูลของคุณด้วยคอมพรีเฮนชันที่สื่อความหมาย เพื่อแปลง กรอง และจัดดัชนีข้อมูลใหม่

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

คอมพรีเฮนชันของลิสต์ (list comprehension) ย่อรูปแบบที่พบบ่อยที่สุดในการเขียนโปรแกรมให้กระชับ นั่นคือการสร้างลิสต์ด้วยการแปลงหรือกรองลำดับข้อมูล ไวยากรณ์ของมันอ่านได้เหมือนประโยค [expression for element in sequence if condition] ให้ผลลัพธ์เดียวกับลูปที่ใช้ append แต่อยู่ในบรรทัดเดียวเชิงประกาศ ซึ่งนักพัฒนา Python ทุกคนจดจำได้ในพริบตา

PYTHON
prices = [12.0, 49.9, 5.5, 199.0]

with_tax = [round(p * 1.2, 2) for p in prices]
cheap = [p for p in prices if p < 50]

print(with_tax)  # [14.4, 59.88, 6.6, 238.8]
print(cheap)     # [12.0, 49.9, 5.5]
แปลงค่าด้วยนิพจน์ กรองด้วย if ที่ต่อท้าย

คอมพรีเฮนชันของดิกชันนารี (dictionary comprehension) ใช้ตรรกะเดียวกันด้วยไวยากรณ์ {key: value for ...} กรณีใช้งานที่พบบ่อยมากในโปรเจกต์คือ การจัดดัชนีลิสต์ของอ็อบเจกต์ใหม่โดยใช้ตัวระบุของมัน เพื่อให้ค้นหาได้ทันทีแทนที่จะต้องไล่อ่านทั้งลิสต์ทุกครั้งที่ต้องการข้อมูล

PYTHON
users = [
    {"id": 7, "name": "Alice"},
    {"id": 12, "name": "Bruno"},
    {"id": 31, "name": "Chloe"},
]

by_id = {u["id"]: u["name"] for u in users}
print(by_id[12])    # Bruno
print(31 in by_id)  # True
การจัดดัชนีใหม่ตามตัวระบุ คือของคู่กันกับโค้ดระดับมืออาชีพ

if มีได้สองตำแหน่ง และมีสองบทบาทที่ต่างกัน เมื่อวางไว้ หลัง for มันจะ กรอง สมาชิกที่ไม่ผ่านจะไม่ปรากฏในผลลัพธ์ เมื่อวางไว้ ก่อน for ในฐานะนิพจน์เงื่อนไข (a if condition else b) มันจะ เลือกค่า ให้สมาชิกแต่ละตัว ลิสต์ที่ได้จึงมีความยาวเท่ากับต้นฉบับ

PYTHON
scores = [45, 82, 67, 91]

labels = ["pass" if s >= 60 else "fail" for s in scores]
print(labels)  # ['fail', 'pass', 'pass', 'pass']
นิพจน์เงื่อนไขแปลงค่าสมาชิกทุกตัวโดยไม่ตัดตัวใดออกเลย

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. ใน [x * 2 for x in data if x > 0] บทบาทของ if คืออะไร?
    • มันเลือกระหว่างสองค่าให้กับสมาชิกแต่ละตัว
    • มันกรอง โดยเก็บไว้เฉพาะสมาชิกที่เป็นบวก
    • มันหยุดคอมพรีเฮนชันที่สมาชิกตัวแรกที่เป็นลบ
  2. {n: n * n for n in range(3)} สร้างอะไรออกมา?
    • {0: 0, 1: 1, 2: 4}
    • {1: 1, 2: 4, 3: 9}
    • [0, 1, 4]
    • {0, 1, 4}
  3. เมื่อใดที่ควรเปลี่ยนคอมพรีเฮนชันกลับไปใช้ลูปแบบดั้งเดิม?
    • เมื่อตรรกะเริ่มซับซ้อนหรือซ้อนกันหลายชั้น
    • ทันทีที่ลิสต์มีสมาชิกเกินหนึ่งร้อยตัว
    • ไม่มีเลย คอมพรีเฮนชันดีกว่าเสมอ