reduce() ใน Python: การลดข้อมูลซ้ำๆ ให้เหลือผลลัพธ์เดียว

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

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

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

reduce() ใน Python: การลดข้อมูลซ้ำๆ ให้เหลือผลลัพธ์เดียว

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

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

reduce() คืออะไร
reduce() เป็นฟังก์ชันที่ใช้สำหรับ "ลด" หรือ "ยุบรวม" (aggregate) ลำดับของข้อมูล (เช่น ลิสต์, ทูเพิล) ให้เหลือเพียงค่าเดียว โดยการใช้ฟังก์ชันที่กำหนดซ้ำๆ กับคู่ขององค์ประกอบต่างๆ ฟังก์ชันนี้จะทำงานแบบสะสม (cumulative) คือ จะนำผลลัพธ์ของการประมวลผลคู่แรก ไปใช้ร่วมกับองค์ประกอบถัดไปเรื่อยๆ จนกว่าจะหมดลำดับ

ต้องนำเข้า reduce จากโมดูล functools ก่อนใช้งาน:

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

from functools import reduce
ไวยากรณ์ (Syntax):

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

reduce(function, iterable[, initializer])
- function: ฟังก์ชันที่รับอาร์กิวเมนต์สองตัวและดำเนินการกับอาร์กิวเมนต์เหล่านั้น
- iterable: คือชุดข้อมูลที่เราต้องการลด (เช่น ลิสต์, ทูเพิล, เซ็ต)
- initializer (optional): ค่าเริ่มต้นสำหรับการดำเนินการ หากมี จะถูกวางไว้ก่อนองค์ประกอบแรกใน iterable

reduce() ทำงานอย่างไร
ลองจินตนาการว่าเราต้องการหาผลรวมของตัวเลขในลิสต์ [1, 2, 3, 4] โดยใช้ reduce()

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

from functools import reduce

# ฟังก์ชันสำหรับบวกตัวเลขสองตัว
def add(x, y):
    print(f"{x} + {y} = {x + y}")
    return x + y

numbers = [1, 2, 3, 4]
total = reduce(add, numbers)
print(f"ผลลัพธ์ : {total}")
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.64 KiB) Viewed 65 times
การหาผลคูณของตัวเลขในลิสต์

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

from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(f"Product: {product}")
คำอธิบาย
- รอบแรก 1 * 2 = 2
- รอบสอง 2 * 3 = 6
- รอบสาม 6 * 4 = 24
- รอบสี่ 24 * 5 = 120
ผลลัพธ์
Python Knowledge-2.png
Python Knowledge-2.png (1.29 KiB) Viewed 65 times
การใช้ initializer:
หากเราต้องการให้มีค่าเริ่มต้นในการคำนวณ เช่น ต้องการผลรวมที่เริ่มจาก 100:

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

from functools import reduce

numbers = [1, 2, 3, 4]
total_with_initial = reduce(lambda x, y: x + y, numbers, 100)
print(f"Total with initial value: {total_with_initial}")
- รอบแรก 100 + 1 = 101
- รอบสอง 101 + 2 = 103
- รอบสาม 103 + 3 = 106
- รอบสี่ 106 + 4 = 110
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.28 KiB) Viewed 65 times
การเชื่อมสตริงเข้าด้วยกัน:

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

from functools import reduce

words = ["Hello", " ", "World", "!"]
sentence = reduce(lambda x, y: x + y, words)
print(f"Sentence: {sentence}") 
ผลลัพธ์
Python Knowledge-1.png
Python Knowledge-1.png (1.03 KiB) Viewed 65 times
การหาค่าสูงสุดในลิสต์:

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

from functools import reduce

numbers = [5, 12, 3, 8, 20, 7]
max_value = reduce(lambda x, y: x if x > y else y, numbers)
print(f"Max value: {max_value}")
ผลลัพธ์
Python Knowledge-2.png
Python Knowledge-2.png (1009 ไบต์) Viewed 65 times
เมื่อใดควรใช้ reduce()?
แม้ว่า reduce() จะทรงพลัง แต่ก็ไม่ได้เป็นฟังก์ชันที่ใช้บ่อยเท่า map() หรือ filter() เหตุผลหลักคือ ความสามารถในการอ่านโค้ด บางครั้งการใช้ลูป for หรือฟังก์ชันในตัวอื่นๆ อาจจะทำให้โค้ดเข้าใจง่ายกว่า

คุณควรพิจารณาใช้ reduce() เมื่อ:
- ปัญหาของคุณมีลักษณะของการรวมข้อมูลแบบสะสม: เช่น การหาผลรวม, ผลคูณ, การรวมสตริง, การเปรียบเทียบหาค่าสูงสุด/ต่ำสุดในลักษณะทีละคู่
- โค้ดที่ได้จากการใช้ reduce() สั้นและอ่านง่ายกว่า: โดยเฉพาะเมื่อใช้ร่วมกับ lambda function สำหรับการดำเนินการที่ไม่ซับซ้อน

สรุป
reduce() เป็นฟังก์ชันที่ทรงพลังใน Python ที่ช่วยให้คุณสามารถ "ลด" ลำดับของข้อมูลให้เหลือค่าเดียว โดยการใช้ฟังก์ชันสะสมซ้ำๆ แม้ว่ามันอาจไม่ได้ถูกใช้งานบ่อยเท่า map() หรือ filter() แต่ reduce() ก็ยังคงเป็นเครื่องมือที่ยอดเยี่ยมสำหรับปัญหาที่มีลักษณะเฉพาะของการรวมข้อมูลทีละคู่ คุณได้เรียนรู้ไวยากรณ์, การทำงานทีละขั้นตอน, และได้เห็นตัวอย่างการนำไปใช้ในสถานการณ์ต่างๆ รวมถึงข้อควรพิจารณาในการเลือกว่าจะใช้ reduce() หรือทางเลือกอื่นๆ การทำความเข้าใจ reduce() จะทำให้มีทางเลือกในการใช้ function ในการใช้งานเช่น ใช้เพื่อให้โค้ดกระชับและมีประสิทธิภาพ: สำหรับบางสถานการณ์ reduce() สามารถทำให้โค้ดของคุณสั้นลงและเข้าใจง่ายขึ้น โดยเฉพาะเมื่อใช้ร่วมกับ lambda function

อ้างอิง
- https://www.mindphp.com/คู่มือ/73-คืออะ ... ออะไร.html
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ction.html
- https://www.mindphp.com/developer/tips- ... ython.html
- viewtopic.php?t=104258
- viewtopic.php?t=116403
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

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

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