itertools จัดการข้อมูลวนซ้ำอย่างมีประสิทธิภาพใน Python

แชร์ความรู้ภาษา Python ไพทอน การเขียนโปรแกรมภาษาไพทอน

Moderator: mindphp, ผู้ดูแลกระดาน

Sakana
PHP Super Member
PHP Super Member
โพสต์: 459
ลงทะเบียนเมื่อ: 16/06/2025 9:38 am

itertools จัดการข้อมูลวนซ้ำอย่างมีประสิทธิภาพใน Python

โพสต์ที่ยังไม่ได้อ่าน โดย Sakana »

ในการเขียนโปรแกรม Python การจัดการกับข้อมูลที่เป็นลำดับ (sequences) หรือที่สามารถวนซ้ำได้ (iterables) เป็นเรื่องปกติ แต่บ่อยครั้งที่เราต้องการสร้างลำดับที่ซับซ้อนขึ้นมา เช่น การรวมชุดของตัวเลข การสร้างผลลัพธ์ที่เป็นไปได้ทั้งหมด หรือการสับเปลี่ยนตำแหน่ง ฟังก์ชันพื้นฐานอาจจะเพียงพอสำหรับงานง่ายๆ แต่เมื่อโจทย์ซับซ้อนขึ้น itertools คือโมดูลที่จะเข้ามาช่วยให้การจัดการข้อมูลวนซ้ำเหล่านี้กลายเป็นเรื่องง่าย มีประสิทธิภาพ และใช้หน่วยความจำได้อย่างคุ้มค่า บทความนี้จะพาคุณไปรู้จักกับ itertools ว่ามันคืออะไร ทำไมถึงมีประโยชน์ และจะนำไปใช้งานได้อย่างไร เพื่อให้โค้ดของคุณทรงพลังและอ่านง่ายยิ่งขึ้น

itertools คืออะไร?
itertools คือ โมดูลมาตรฐาน (standard library) ของ Python ที่รวบรวมฟังก์ชันสำหรับ สร้าง iterators ที่มีประสิทธิภาพ (efficient iterators) หรือที่เรียกว่า "iterator building blocks" ซึ่งหมายความว่ามันไม่ได้สร้างลิสต์ทั้งหมดขึ้นมาในหน่วยความจำทันที แต่จะสร้างองค์ประกอบทีละตัวเมื่อมีการเรียกใช้ (lazy evaluation) ทำให้เหมาะสำหรับการจัดการกับข้อมูลขนาดใหญ่หรือลำดับที่ไม่มีที่สิ้นสุด

ทำไมต้องใช้ itertools
- ประสิทธิภาพด้านหน่วยความจำ (Memory Efficiency): เนื่องจาก itertools สร้างผลลัพธ์แบบทีละตัว (on-demand) มันจึงใช้หน่วยความจำน้อยกว่าการสร้างลิสต์ขนาดใหญ่ทั้งหมดในคราวเดียว ซึ่งสำคัญมากเมื่อทำงานกับข้อมูลจำนวนมหาศาล
- ประสิทธิภาพด้านความเร็ว (Performance): ฟังก์ชันใน itertools ถูกเขียนด้วยโค้ด C ที่ปรับปรุงมาอย่างดี ทำให้ทำงานได้เร็วกว่าการเขียนลูปด้วยตัวเองในหลายๆ กรณี
- ความกระชับของโค้ด (Code Conciseness): itertools มีฟังก์ชันที่ครอบคลุมงานทั่วไปเกี่ยวกับการวนซ้ำ ทำให้คุณเขียนโค้ดได้สั้นลงและอ่านง่ายขึ้น
- พลังในการรวมกัน (Combinatoric Power): ฟังก์ชันต่างๆ ใน itertools สามารถนำมาประกอบรวมกันเพื่อสร้างการทำงานที่ซับซ้อนได้อย่างน่าทึ่ง

itertools แบ่งฟังก์ชันออกเป็นกลุ่มใหญ่ๆ
1. Infinite Iterators (วนซ้ำไม่สิ้นสุด)
ฟังก์ชันเหล่านี้จะสร้างลำดับที่ไม่มีที่สิ้นสุด เหมาะสำหรับสถานการณ์ที่ต้องการการสร้างข้อมูลแบบต่อเนื่อง
count(start=0, step=1): สร้างลำดับตัวเลขที่เพิ่มขึ้นเรื่อยๆ

โค้ด: เลือกทั้งหมด

from itertools import count

for i in count(10, 2):
    if i > 20:
        break
    print(i) 
คำอธิบาย
- count(start=10, step=2): เริ่มที่ 10 เพิ่มที่ละ 2
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.08 KiB) Viewed 99 times
cycle(iterable): วนซ้ำองค์ประกอบใน iterable ไปเรื่อยๆ

โค้ด: เลือกทั้งหมด

from itertools import cycle

colors = ['red', 'green', 'blue']
count = 0
for color in cycle(colors):
    if count >= 7:
        break
    print(color)
    count += 1
ผลลัพธ์
Python Knowledge-2.png
Python Knowledge-2.png (1.1 KiB) Viewed 99 times
repeat(object, times=None): ส่งคืน object เดิมซ้ำๆ กัน times ครั้ง ถ้าไม่ระบุ times จะวนซ้ำไม่สิ้นสุด

โค้ด: เลือกทั้งหมด

from itertools import repeat

for i in repeat("Hello", 3):
    print(i) 
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (612 ไบต์) Viewed 99 times
2. Terminators on the Shortest Input Sequence (หยุดเมื่อ Input สั้นที่สุด)
ฟังก์ชันเหล่านี้จะหยุดทำงานเมื่อ Input ใด Input หนึ่งหมด
chain(*iterables): รวมหลาย iterables เข้าด้วยกันเป็น iterable เดียว

โค้ด: เลือกทั้งหมด

from itertools import chain

list1 = [1, 2, 3]
list2 = ['a', 'b']
combined = chain(list1, list2)
print(list(combined))
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (874 ไบต์) Viewed 99 times
compress(data, selectors): กรอง data โดยใช้ selectors (ลำดับของค่า True/False)

โค้ด: เลือกทั้งหมด

from itertools import compress

data = ['A', 'B', 'C', 'D']
selectors = [True, False, True, False]
filtered = compress(data, selectors)
print(list(filtered))
ผลลัพธ์
Python Knowledge-2.png
Python Knowledge-2.png (673 ไบต์) Viewed 99 times
zip_longest(*iterables, fillvalue=None): รวมหลาย iterables เข้าด้วยกัน โดยจะรวมไปจนกว่า iterable ที่ยาวที่สุดจะหมด และเติม fillvalue ในช่องที่ขาดหายไป

โค้ด: เลือกทั้งหมด

from itertools import zip_longest

names = ['Alice', 'Bob']
ages = [25, 30, 35]
for name, age in zip_longest(names, ages, fillvalue='N/A'):
    print(f"{name}: {age}")
ผลลัพธ์
Python Knowledge-3.png
Python Knowledge-3.png (1.46 KiB) Viewed 99 times
3. Combinatoric Generators (สร้างชุดค่าผสมที่เป็นไปได้)
ฟังก์ชันเหล่านี้มีประโยชน์มากสำหรับการสร้างชุดค่าผสม, การเรียงสับเปลี่ยน, และการเลือกกลุ่มย่อย
product(*iterables, repeat=1): สร้างผลคูณคาร์ทีเซียน (Cartesian product) ของ Input iterables คล้ายกับการใช้ Nested Loop

โค้ด: เลือกทั้งหมด

from itertools import product

# ลูกเต๋า 2 ลูก
rolls = product(range(1, 7), repeat=2)
print(list(rolls)) 
ผลลัพธ์

โค้ด: เลือกทั้งหมด

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
permutations(iterable, r=None): สร้างการเรียงสับเปลี่ยน (permutations) ที่เป็นไปได้ทั้งหมดขององค์ประกอบใน iterable
ถ้า r ระบุไว้ จะสร้าง permutations ที่มีขนาด r

โค้ด: เลือกทั้งหมด

from itertools import permutations

letters = ['A', 'B', 'C']
perms = permutations(letters,3)
print(list(perms))
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.81 KiB) Viewed 99 times
combinations(iterable, r): สร้างชุดค่าผสม (combinations) ที่เป็นไปได้ทั้งหมดขององค์ประกอบใน iterable
โดยเลือกมา r ตัว โดยไม่สนใจลำดับ (A, B เหมือนกับ B, A)

โค้ด: เลือกทั้งหมด

from itertools import combinations

numbers = [1, 2, 3, 4]
combs = combinations(numbers, 2) # เลือกมา 2 ตัว
print(list(combs))
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.94 KiB) Viewed 99 times
4. Filtering Iterators (กรองข้อมูล)
filterfalse(predicate, iterable): ส่งคืนองค์ประกอบที่ predicate (ฟังก์ชันเงื่อนไข) เป็น False (ตรงข้ามกับ filter() ทั่วไป)

โค้ด: เลือกทั้งหมด

from itertools import filterfalse

numbers = [1, 2, 3, 4, 5, 6]
odd_numbers = filterfalse(lambda x: x % 2 == 0, numbers) # กรองเอาตัวเลขที่ไม่ใช่คู่ (คือเลขคี่)
print(list(odd_numbers)) 
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (729 ไบต์) Viewed 99 times
สรุป
itertools เป็นหนึ่งในโมดูลที่ทรงคุณค่าที่สุดใน Python สำหรับการจัดการกับข้อมูลวนซ้ำ คุณได้เห็นแล้วว่าฟังก์ชันต่างๆ ใน itertools ช่วยให้คุณสามารถสร้างลำดับข้อมูลได้หลากหลายรูปแบบ ไม่ว่าจะเป็นลำดับไม่สิ้นสุด การรวมลำดับ การสร้างชุดค่าผสม หรือการกรองข้อมูล ทั้งหมดนี้ล้วนทำได้อย่างมีประสิทธิภาพสูงและใช้หน่วยความจำน้อยลงอย่างมาก การทำความเข้าใจและนำ itertools ไปใช้จะมอบประโยชน์สำคัญ เช่น
- ยกระดับการเขียนโค้ด: คุณจะสามารถเขียนโค้ดที่กระชับ ชัดเจน และมีประสิทธิภาพมากขึ้น โดยเฉพาะเมื่อต้องจัดการกับข้อมูลจำนวนมากหรือการดำเนินการที่ซับซ้อน
- เพิ่มประสิทธิภาพแอปพลิเคชัน: การใช้ iterators ที่สร้างโดย itertools จะช่วยลดการใช้หน่วยความจำและปรับปรุงความเร็วในการประมวลผล ทำให้แอปพลิเคชันของคุณทำงานได้ดียิ่งขึ้น

อ้างอิง
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ython.html
- https://www.mindphp.com/บทเรียนออนไลน์/ ... -type.html
- viewtopic.php?t=115050
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ments.html
- viewtopic.php?t=104258
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 2