Python Flatten List: คู่มือวิธีทำ
การทำให้ลิสต์แบน (Flattening a list) หมายถึงกระบวนการลบมิติ (dimension) ออกจากลิสต์ มิติหมายถึงพิกัดเพิ่มเติมที่ต้องใช้ในการระบุตำแหน่งรายการในลิสต์ คุณสามารถทำให้ลิสต์ Python แบนได้ด้วย list comprehension, nested for loop, หรือเมธอด itertools.chain()
ลิสต์ Python สามารถมีหลายมิติได้ หมายถึงคุณมีลิสต์ภายในลิสต์ ลิสต์เหล่านี้ บางครั้งเรียกว่า "nested lists" สามารถแปลงกลับเป็นลิสต์ทั่วไปได้
นี่หมายความว่าคุณสามารถย้ายค่าทั้งหมดจากลิสต์ภายในลิสต์ ไปยังลิสต์เดียว การเปลี่ยนลิสต์ของลิสต์เป็นลิสต์เรียกว่า "การทำให้ลิสต์แบน" (flattening a list)
Python Flatten List
มีสามวิธีทำให้ลิสต์ Python แบน:
- ใช้ list comprehension
- ใช้ nested for loop
- ใช้เมธอด itertools.chain()
ในคู่มือนี้ เราพูดถึงวิธีทำให้ลิสต์แบนด้วย list comprehension, for loop, และ itertools.chain() เราเดินทางผ่านสองตัวอย่าง เพื่อให้คุณเริ่มทำให้ลิสต์แบนในโปรแกรมของตัวเองได้
Python: Flatten List ด้วย List Comprehension
List comprehension ใน Python กำหนดลิสต์จากเนื้อหาของลิสต์ที่มีอยู่ คุณสามารถปรับแต่งแต่ละองค์ประกอบที่ไปอยู่ในลิสต์ใหม่โดยระบุเงื่อนไขหรือการเปลี่ยนแปลงภายใน comprehension
Comprehensions เป็น syntactic sugar สำหรับการใช้ for loop วนผ่านลิสต์และสร้างลิสต์ใหม่ หมายถึงทำงานในพื้นฐานเดียวกับ for loop แต่ใช้ไวยากรณ์ต่างกัน
ไวยากรณ์ list comprehension:
numbers = [1, 2, 3] new_numbers = [number * 2 for number in numbers]
Comprehension นี้คูณตัวเลขแต่ละตัวในลิสต์ "numbers" ด้วย 2
Flatten List: ตัวอย่าง List Comprehension
เรามีลิสต์ของลิสต์ ที่มีไส้แซนด์วิชต่างๆ ที่ร้านอาหารมีอยู่ ปัจจุบันลิสต์ของลิสต์เป็น:
foods = [
["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
["Cheese", "Egg"],
["Ham", "Bacon", "Chicken Club", "Tuna"]
]
ลิสต์แรกมีไส้แซนด์วิชเวกาน (vegan) ลิสต์ที่สองมีไส้เวจิเทเรียน (vegetarian) ลิสต์ที่สามมีไส้ที่มีเนื้อสัตว์
เราต้องการเปลี่ยนลิสต์นี้เป็นลิสต์เดียวของอาหาร ง่ายกว่าทำงานกับลิสต์มิติเดียวแทนที่จะเป็นสองมิติ ไม่มีเหตุผลที่จะมีมากกว่าหนึ่งมิติในลิสต์นี้ เพื่อลบมิติที่สองออกจากลิสต์ เราสามารถใช้ list comprehension:
new_foods = [food for sublist in foods for food in sublist] print(new_foods)
List comprehension นี้วนผ่านทุกลิสต์ในตัวแปร foods ของ Python แต่ละค่าจะถูกเพิ่มเข้าไปในลิสต์หลัก เมื่อลิสต์สร้างเสร็จ เราพิมพ์ไปที่คอนโซล
มารันโค้ดและดูผล:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
ลิสต์ของลิสต์ของเราถูกแปลงเป็น flat list สำเร็จ ส่วนผสมทั้งหมดปรากฏในลิสต์เดียวแทนที่จะเป็นสามลิสต์
Python: Flatten List ด้วย Nested For Loop
เราสามารถทำผลลัพธ์เดียวกันได้ด้วย nested for loop ของ Python "Nested for loop" เป็นอีกชื่อของ "for loop ภายใน for loop" List comprehension ของเราเป็นอีกวิธีแทน nested for loop นี้:
new_foods = []
for sublist in foods:
for food in sublist:
new_foods.append(food)
print(new_foods)
โค้ดของเราใช้ for loop สองตัว วนผ่านแต่ละรายการลิสต์ในแต่ละลิสต์ในลิสต์ของลิสต์ต้นฉบับ มารันโค้ด:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
โปรแกรมคืนผลลัพธ์เดียวกับ list comprehension ในกรณีส่วนใหญ่ list comprehension เป็นวิธีแก้ปัญหาที่ดีกว่า for loop List comprehensions สั้นกว่า และในกรณีนี้ อ่านง่ายกว่า nested for loop
Python: Flatten List ด้วย Itertools
Itertools เป็นโมดูลใน Python standard library โมดูลนี้ให้เมธอดหลายตัว ทำให้ทำงานกับ iterable objects และ generators ง่ายขึ้น
เพื่อวัตถุประสงค์ของเรา เราอ้างอิงแค่เมธอด chain() เมธอดนี้รับลิสต์ของลิสต์และคืนค่า flattened list
เริ่มต้นด้วยการนำเข้าโมดูล itertools เข้าโค้ดด้วยคำสั่ง import ของ Python:
import itertools
ต่อไป กำหนดลิสต์ของลิสต์ และใช้ chain() ทำให้ลิสต์แบน:
foods = [
["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
["Cheese", "Egg"],
["Ham", "Bacon", "Chicken Club", "Tuna"]
]
new_foods = itertools.chain(*foods)
ในโค้ด เราใช้สัญลักษณ์ * เพื่อ unpack ลิสต์ของเรา แปลงลิสต์เป็น function arguments ที่ parse ได้โดย chain()
เมธอด chain() คืนค่า itertools.chain object เพื่อดู flattened list เราต้องแปลง object นี้เป็นลิสต์ ทำได้ด้วยเมธอด list():
print(list(new_foods))
มารันโค้ด:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
โค้ดของเราทำให้ลิสต์แบนแล้ว
แม้ itertools จะเป็นวิธีที่มีประสิทธิภาพในการทำให้ลิสต์แบน แต่ก็ขั้นสูงกว่าสองวิธีที่อธิบายไป
เพราะคุณต้องนำเข้า itertools เข้าโค้ด ซึ่งเพิ่ม dependency ใหม่ เพิ่มเติม chain() เกี่ยวกับ unpacking ที่อาจยากต่อการเข้าใจสำหรับมือใหม่
สรุป
คุณสามารถทำให้ลิสต์ Python แบนได้ด้วย list comprehension, nested for loop, และ itertools.chain() List comprehension เป็นวิธีที่ "Pythonic" ที่สุด จึงได้รับความนิยมในกรณีส่วนใหญ่
แม้ nested for loops จะมีประสิทธิภาพ แต่ใช้บรรทัดโค้ดมากกว่า list comprehension เมธอด itertools.chain() มีประสิทธิภาพคล้ายกัน แต่ยากต่อการเข้าใจสำหรับมือใหม่
ปกติไม่จำเป็นต้องนำเข้าไลบรารีใหม่ — itertools — เมื่อ Python ให้เครื่องมือทั้งหมดที่คุณต้องการทำให้ลิสต์แบน
ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Python? ดูคู่มือ How to Learn Python ของเรา จะพบเคล็ดลับการเรียนรู้จากผู้เชี่ยวชาญและรายการคอร์สและหนังสือชั้นนำ