การตัดช่วง (Slicing) ใน Python: สตริง ลิสต์ และทูเพิล
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกภาพพิซซ่าที่ตัดเป็น 8 ชิ้น มีหมายเลข 0 ถึง 7 คุณไม่ได้อยากได้พิซซ่าทั้งถาดเสมอไป บางครั้งคุณอยากได้ชิ้นที่ 2 ถึง 5 บางครั้งอยากได้ชิ้นเว้นชิ้น บางครั้งอยากได้แค่สามชิ้นสุดท้าย
การตัดช่วง (slicing) ใน Python ช่วยให้คุณดึงบางส่วนของลำดับข้อมูลใดก็ได้ ไม่ว่าจะเป็นลิสต์ สตริง หรือทูเพิล ด้วยรูปแบบการเขียนที่เรียบง่ายแบบเดียวกัน เป็นหนึ่งในความสามารถที่สวยงามที่สุดของ Python และเมื่อเรียนรู้แล้ว คุณจะใช้มันทุกที่
ในบทเรียนนี้ คุณจะได้เรียนรูปแบบ start:stop:step วิธีทำงานของดัชนีลบ วิธีกลับลำดับข้อมูลใดๆ และรูปแบบการตัดช่วงที่นักพัฒนา Python ใช้กันบ่อยที่สุดในทุกวัน
การตัดช่วงพื้นฐานทำงานอย่างไร
รูปแบบพื้นฐานของการตัดช่วงคือ sequence[start:stop] ซึ่งให้สมาชิกตั้งแต่ดัชนี start ไปจนถึง (แต่ ไม่รวม) ดัชนี stop ให้นึกถึงช่วงครึ่งเปิด (half-open interval)
['banana', 'cherry'] ['apple', 'banana', 'cherry'] ['cherry', 'date', 'elderberry']
กฎ "หยุดก่อนถึง stop" อาจดูแปลกในตอนแรก แต่มีข้อดีที่น่าสนใจ: fruits[0:3] ให้สมาชิก 3 ตัวพอดี สำหรับการตัดช่วงแบบ [start:stop] ธรรมดาที่ 0 <= start <= stop <= len(fruits) จำนวนสมาชิกที่ได้คือ stop - start
[10, 20, 30] [40, 50, 60] [10, 20, 30, 40, 50, 60]
พารามิเตอร์ step ทำอะไร
รูปแบบเต็มของการตัดช่วงคือ sequence[start:stop:step] step กำหนดว่าจะกระโดดไกลแค่ไหนระหว่างสมาชิกแต่ละตัวที่หยิบ step เป็น 2 คือหยิบเว้นตัว step เป็น 3 คือหยิบทุก ๆ ตัวที่สาม
[0, 2, 4, 6, 8] [1, 3, 5, 7, 9] [0, 3, 6, 9] [1, 3, 5]
ถ้าไม่ระบุ start และ stop และ step เป็นบวก การตัดช่วงจะครอบคลุมทั้งลำดับตั้งแต่ต้นจนจบ ส่วน step ที่เป็นลบจะสลับค่าเริ่มต้นเหล่านั้น โดยเริ่มจากท้ายลำดับ ดังที่คุณจะเห็นด้านล่าง คุณต้องระบุค่าเหล่านี้ก็ต่อเมื่ออยากจำกัดช่วงให้แคบลง
ดัชนีลบในการตัดช่วงทำงานอย่างไร
ดัชนีลบนับจากท้ายลำดับ -1 คือสมาชิกตัวสุดท้าย -2 คือตัวรองสุดท้าย และต่อไปเรื่อยๆ คุณใช้ตัวเลขติดลบได้ทุกส่วนของการตัดช่วง ทั้ง start, stop และ step
['d', 'e', 'f'] ['a', 'b', 'c', 'd'] ['e', 'f']
ดัชนีลบมีประโยชน์มากเมื่อคุณต้องการสมาชิกโดยนับจากท้าย เช่น my_list[-3:] ให้สมาชิกสามตัวสุดท้ายเสมอ ไม่ว่าลิสต์จะยาวแค่ไหน
ytho thon Py
วิธีกลับลำดับข้อมูลด้วย [::-1]
step ที่ติดลบบอก Python ให้เดินถอยหลัง รูปแบบที่พบบ่อยที่สุดคือ [::-1] ซึ่งกลับลำดับข้อมูลทั้งหมด ไม่มี start ไม่มี stop และ step เป็น -1 คือเดินจากท้ายไปต้นเท่านั้นเอง
[5, 4, 3, 2, 1] olleh (40, 30, 20, 10)
คุณใช้ step ที่ติดลบร่วมกับ start และ stop เพื่อกลับลำดับแค่บางส่วนได้ เมื่อใช้ step ติดลบ start ควรมากกว่า stop เพราะคุณกำลังเดินถอยหลัง
[7, 6, 5, 4, 3] [9, 7, 5, 3, 1]
การตัดช่วงสตริง ลิสต์ และทูเพิล
รูปแบบ [start:stop:step] เดียวกันนี้ใช้ได้กับลำดับข้อมูลทุกชนิด สิ่งเดียวที่ต่างคือสิ่งที่ได้กลับมา: ตัดช่วงลิสต์ได้ลิสต์ ตัดช่วงสตริงได้สตริง และตัดช่วงทูเพิลได้ทูเพิล
Alex <class 'str'> [85, 77, 92] (10, 30, 50)
รูปแบบการตัดช่วงที่นักพัฒนา Python ทุกคนควรรู้
นี่คือรูปแบบการตัดช่วงที่คุณจะเห็นและใช้บ่อยที่สุด ใช้เป็นตารางอ้างอิงฉบับย่อได้เลย
['a', 'b', 'c'] ['e', 'f', 'g'] ['b', 'c', 'd', 'e', 'f', 'g'] ['a', 'b', 'c', 'd', 'e', 'f'] ['b', 'c', 'd', 'e', 'f'] ['g', 'f', 'e', 'd', 'c', 'b', 'a']
คุณยังใช้การตัดช่วงทางซ้ายของการกำหนดค่าเพื่อแทนที่บางส่วนของลิสต์ได้ด้วย เรียกว่า การกำหนดค่าแบบตัดช่วง (slice assignment)
['red', 'lime', 'sky', 'yellow', 'purple'] ['red', 'orange', 'yellow', 'purple']
แบบฝึกหัด
จากลิสต์ animals ใช้การตัดช่วงเพื่อแสดงเฉพาะสมาชิกสามตัวตรงกลาง: ['cat', 'dog', 'elephant']
โค้ดนี้แสดงผลอะไร คิดให้ดีเรื่องดัชนีลบ
word = 'programming'
print(word[-4:])เขียนคำสั่ง print() ที่แสดงผลออกมาเหมือนกันทุกตัวอักษร
จากลิสต์ letters ใช้การตัดช่วงพร้อม step เพื่อแสดงเฉพาะสมาชิกที่ดัชนีเป็นเลขคู่ (0, 2, 4, 6) ผลลัพธ์ควรเป็น ['a', 'c', 'e', 'g']
ใช้การตัดช่วงเพื่อกลับลำดับสตริง word แล้วแสดงผล ผลลัพธ์ควรเป็น nohtyp
โค้ดนี้พยายามดึงสมาชิกสามตัวสุดท้ายจากลิสต์ แต่ใช้การตัดช่วงผิด แก้บั๊กให้แสดงผล ['date', 'elderberry', 'fig']
เขียนฟังก์ชันชื่อ is_palindrome(text) ที่คืนค่า True ถ้าข้อความอ่านจากหน้าไปหลังและจากหลังไปหน้าได้เหมือนกัน และคืน False ถ้าไม่ใช่ ใช้การตัดช่วงเพื่อกลับลำดับสตริง และแปลงข้อความเป็นตัวพิมพ์เล็กก่อน เพื่อให้การตรวจไม่สนใจว่าเป็นตัวพิมพ์เล็กหรือใหญ่
ทดสอบด้วยการเรียกเหล่านี้:
print(is_palindrome('racecar'))
print(is_palindrome('Python'))
print(is_palindrome('Madam'))