10 Python Itertools To Make Your Code Neater, Cleaner, and Better

15-Sep-23

คัมภีร์เทพ IT

See the original english version Click here!

 

จุดเด่นของ Python คือความเรียบง่าย มันมีทั้ง Syntax หรือ Built-in Modules มากมายที่ช่วยให้เราใช้ Functions ทั่วไปได้อย่างมีประสิทธิภาพ และ Itertools Module ก็เป็นอีกหนึ่งเครื่องมือที่มีประสิทธิภาพในการจัดการกับ Python Iterables ด้วย Code ที่สั้นกว่า ดังนั้นเรามาดู 10 Python Itertools ที่ช่วยให้ Code ของคุณ Clean ขึ้นกว่าเดิม กันดีกว่า

1. itertools.product(): ทางเลือกในการหลีกเลี่ยง Nested Loops

เมื่อ Program มีความซับซ้อนมากขึ้นเรื่อย ๆ คุณอาจต้องเขียน Nested Loops นั่นอาจส่งผลให้ Python Code ของคุณอ่านแล้วทำความเข้าใจยากขึ้น:

คำถามคือ เราจะสร้าง Code ด้านบนให้เข้าหลักของ Python ใหม่อีกครั้งได้อย่างไร?

และ itertools.product() Function ก็คือคำตอบ:

ดังที่แสดงไว้ข้างต้น มันจะ Return ผลคูณคาร์ทีเซียน (Cartesian Product) ของ Input Iterables ซึ่งจะช่วยให้เราสามารถรวมทั้ง 3 Loops ที่ซ้อนกันไว้เป็นหนึ่งเดียว

2. itertools.compress(): วิธีที่สะดวกในการ Filter Data

แน่นอนว่า เราสามารถ Filter รายการของ Items ผ่าน Loop ไม่กี่ Loop ได้

แต่บางครั้ง เราอาจไม่จำเป็นต้องเขียน Loop แต่อย่างใด เนื่องจากมี Function ที่ชื่อ itertools.compress()

itertools.compress() Function จะ Returns ตัว Iterator ที่ Filter Iterable ตามค่าของ Boolean Mask ที่สอดคล้องกัน

ตัวอย่างเช่น Code ต่อไปนี้จะเลือก Leader ที่แท้จริงโดยใช้ itertools.compress() Function:

Argument ที่ 2 ซึ่งก็คือ Selector จะทำตัวเป็น Mask โดยเราสามารถกำหนดได้ดังนี้:

3. itertools.groupby(): Group Elements ของ Iterable

itertools.groupby() Function เป็นวิธีที่สะดวกในการจัดกลุ่ม Duplicate Items ของ Iterable ที่อยู่ติดกันได้

ตัวอย่างเช่น เราสามารถจัดกลุ่ม Long String ได้ดังนี้:

นอกจากนี้ เราสามารถใช้ Argument ที่ 2 เพื่อบอก groupby() Function ว่า เราจะทราบได้อย่างไรว่า Items ทั้ง 2 เหมือนกันหรือไม่:

4. itertools.combinations(): ทราบการจัดหมู่ทั้งหมดตาม Length ที่กำหนดจาก Iterable

สำหรับมือใหม่ มันอาจต้องใช้เวลาในการเขียน Function ที่ไม่มี Bug เพื่อให้ทราบการจัดหมู่ (Combinations) ของ List ที่เป็นไปได้ทั้งหมด

อันที่จริงแล้ว ถ้าเรารู้จัก itertools.combination() Function เราก็จะสามารถได้คำตอบอย่างง่ายดาย:

ดังที่แสดงใน Program ด้านบน itertools.combination() Function มี Parameters 2 ตัว โดย Parameter ตัวแรกเป็น Original Iterable ส่วน Parameter อีกตัวก็คือ ความยาว (Length) ของ Subsequences ที่จะถูก Generate ขึ้นโดย Function

5. itertools.permutations(): ทราบวิธีเรียงสับเปลี่ยนทั้งหมดตาม Length ที่กำหนดจาก Iterable

ในเมื่อเรามี Function เพื่อให้ทราบวิธีจัดหมู่แล้ว  แน่นอนว่า ก็ยังมี Function อื่นที่ช่วยให้เราทราบการเรียงสับเปลี่ยน (Permutations) ที่เป็นไปได้ทั้งหมดด้วยเช่นกัน นั่นก็คือ itertools.permutations:

ดังที่แสดงไว้ข้างต้น การใช้ itertools.permutations() Function ก็จะคล้ายคลึงกับการใช้ itertools.combinations() Function แต่มีข้อแตกต่างเพียงอย่างเดียว ก็คือ ผลลัพธ์ของพวกมัน

6. itertools.accumulate(): สร้าง Accumulated Items จาก Iterable

การได้รับชุดของค่าสะสม (Accumulated Values) ตาม Iterable ถือเป็น Requirement ทั่วไปที่หลายคนต้องเจอ ด้วยความช่วยเหลือของ itertools.accumulate() Function เราไม่จำเป็นต้องเขียน Loop ใด ๆ เพื่อให้ได้คำตอบที่ต้องการ

แต่หากเราไม่ชอบใช้ operator.mul จาก Program ข้างต้น เราสามารถใช้ Code ด้านล่างนี้ได้:

7. itertools.repeat(), itertools.cycle(), itertools.count(): สร้าง Infinite Iterables

ในบางกรณี เราจำเป็นต้องการใช้ Infinite Iterable ซึ่งมี 3 Functions ที่เป็นประโยชน์สำหรับกรณีนี้:

itertools.repeat(): สร้าง Item เดียวกันซ้ำ ๆ

ตัวอย่างเช่น เราสามารถได้รับ "Yang" ที่เหมือนกันทั้ง 3 รายการ ดังนี้:

itertools.cycle(): รับ Infinite Iterator โดยการทำ Cycle

itertools.cycle Function จะไม่หยุดดำเนินการจนกว่า คุณจะหลุดจาก Loop:

itertools.count(): สร้าง Sequence ของตัวเลขที่ไม่สิ้นสุด

หากเราต้องการแค่ตัวเลข ให้ใช้ itertools.count Function:


ตามที่แสดงไว้ข้างต้น Parameter ตัวแรกคือ ตัวเลขเริ่มต้น และ Parameter ตัวที่ 2 คือ ระยะห่างของค่า (Step)

8. itertools.pairwise(): รับ Tuples of Pairs ได้อย่างง่ายดาย

ตั้งแต่ Python 3.10 เป็นต้นไป Itertools Module มี Function ใหม่ที่ชื่อว่า Pairwise มันเป็นเครื่องมือที่มีขนาดเล็กและเรียบง่ายในการสร้างคู่ที่อยู่ในลำดับติดกัน ลองดูตัวอย่างที่ด้านล่างนี้

9. itertools.takewhile(): Filter Elements ในวิธีต่าง ๆ

itertools.takewhile() จะ Return ตัว Iterator ที่ Generate Elements จาก Iterable ได้ ตราบใดที่ Function มีการประเมินค่าเป็น True

แต่ Function นี้มีความแตกต่างจาก Built-in Filter() Function โดยที่ Filter Function จะตรวจสอบจาก Items ทั้งหมดใน List:

อย่างไรก็ตาม itertools.takewhile Function มันจะหยุดทำงานก็ต่อเมื่อ Function มีการประเมินค่าเป็น False:

10. itertools.dropwhile(): Reverse Operation ของ itertools.takewhile()

Function นี้ ดูเหมือนจะเป็นแนวคิดที่ตรงกันข้ามกับ Function ในข้อก่อนหน้านี้

itertools.takewhile() จะ Return Elements ของ Iterable ตราบใดที่ Function มีการประเมินค่าเป็น True

ในขณะที่ itertools.dropwhile() จะปล่อย Elements ของ Iterable กลับมา ตราบใดที่ Function มีการประเมินค่าเป็น True และจากนั้นมันถึงจะ Return Elements ที่เหลือกลับมาให้

และนี่ก็เป็น 10 Python Itertools ที่ช่วยให้ Code ของคุณ Clean ขึ้นกว่าเดิม หวังว่าคุณจะลองนำพวกมันไปประยุกต์ใช้ในงานของคุณ เพื่อให้ Code ของคุณ Clean ยิ่งขึ้น

ที่มา: https://medium.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด