Python มี data structures ให้ใช้อยู่หลายอย่าง แต่ data structures พื้นฐานใน python ที่เราใช้กันเป็นประจำจะมีอยู่ 4 ตัว คือ list, tuple, set และ dictionary วันนี้เราจะมาดูว่า list และ tuple ใช้งานแตกต่างกันอย่างไรและควรนำมาใช้ในสถานการณ์ไหนบ้าง
List ใน Python
มาเริ่มกันด้วย list กันก่อนเพราะเป็นหนึ่งใน data structure พื้นฐานที่ใช้กันบ่อยที่สุดในการเขียนโปรแกรมด้วย Python ในบางภาษาโปรแกรมมิ่งบางตัวจะเรียกโครงสร้างข้อมูลแบบนี้ว่า Array เช่น Java เป็นต้น
สมมติว่าถ้าหากเราต้องการเก็บข้อมูลรายได้ของบริษัทตั้งแต่ปี 2019 ไปจนถึง 2023 แล้วถ้าเราไม่มี list เราก็คงจะเก็บข้อมูลแบบนี้
revenue2019 = 1900000
revenue2020 = 2000000
revenue2021 = 2100000
revenue2022 = 2200000
revenue2023 = 2300000
print(revenue2022)
# Result will be 2200000
จากนั้นหากเราต้องการใช้งานเราก็จะต้องอ้างอิงข้อมูลจากตัวแปรแต่ละตัว หรือหากเราต้องการใส่ข้อมูลรายได้ปี 2024 เข้าไป เราก็จะต้องสร้างตัวแปรใหม่ขึ้นมาเป็น revenue2024 ซึ่งในการเขียนโปรแกรมแล้วมันไม่สะดวกและทำให้เกิดข้อจำกัดหลายๆอย่าง ดังนั้นเราจึงมักจะใช้ list เพื่อมาเก็บข้อมูลที่เป็นลำดับต่อเนื่องกันไปและมีการอัพเดตเปลี่ยนแปลงใน list ได้ตลอดเวลา เช่นจากตัวอย่างเดียวกันหากเราใช้ list เก็บข้อมูลจะเขียนได้เป็นดังนี้
revenues = [1900000, 2000000, 2100000, 2200000, 2300000]
print(revenues[3])
# Result will be 2200000
จากตัวอย่างจะเห็นว่าเราสร้างตัวแปร list ด้วยการกำหนดค่าตัวแปรไว้ใน [] (เรียกว่า square brackets) และมีการแบ่งค่าใน List ด้วย , ดังนั้นเราสามารถบอกได้ว่า syntax ข้างบนคือการกำหนดตัวแปร revenues ให้เป็นข้อมูลประเภท list ซึ่งมีค่าเป็นตัวเลข 5 ตัว คือ 1900000 ไปจนถึง 2300000 หากเราต้องการอ้างอิงถึงข้อมูลตัวไหน เราสามารถอ้างอิงได้โดยการเรียก revenues[n] โดย n คือลำดับที่ของค่า list โดยลำดับที่นี้จะเริ่มจากลำดับที่ 0 แปลว่าหากเราดูค่า revenues[0] จะได้ผลลัพธ์เป็น 1900000 ในตัวอย่างเรา print(revenues[3]) จึงได้ผลลัพธ์เป็น 2200000
อย่างที่กล่าวไปแล้วข้างต้นว่าเราสามารถที่จะอัพเดตและเปลี่ยนแปลงข้อมูลใน list ได้ตลอดเวลาดังนั้นหากเราต้องการเพิ่มข้อมูลรายได้ของปีถัดไปเข้ามาเราสามารถทำได้ด้วยการใส่ข้อมูลต่อท้ายเข้าไปในลิสต์ ดังนี้
revenues.append(2400000)
print(revenues)
# Result will be [1900000, 2000000, 2100000, 2200000, 2300000, 2400000]
จะเห็นว่าเราใช้คำสั่ง append เพื่อใส่ข้อมูลต่อท้ายเข้าไปในลิสต์ แต่หากเราต้องการใส่ข้อมูลใหม่เข้าไประหว่ง list เราสามารถทำได้โดยใช้ method insert ดังนี้
revenues.insert(1, 1950000)
print(revenues)
# Result will be [1900000, 1950000, 2000000, 2100000, 2200000, 2300000, 2400000]
โดย method insert นั้นรับพารามิเตอร์สองตัว ตัวแรกคือ index หรือลำดับที่ในลิสต์ที่เราจะทำการใส่ข้อมูลแทรกลงไป ตัวที่สองคือค่าที่จะใส่ลงไป จากตัวอย่างจะเห็นว่าเราใส่ค่า 1950000 ลงไปที่ index ที่ 1 ซึ่งจะทำให้ค่า 1950000 กลายเป็นข้อมูลลำดับที่สองของ list (อย่าลืมว่า index ใน python เริ่มที่ 0)
นอกจากนี้เราสามารถดูจำนวนข้อมูลทั้งหมดใน List ได้โดยใช้ฟังก์ชัน len
print(len(revenues))
# Result will be 7
ในกรณีที่เราต้องการแก้ไขค่าใดๆในลิสต์เราสามารถจะทำได้โดยอ้างอิงไปที่อินเด็กซ์นั้นแล้วเปลี่ยนแปลข้อมูลได้เลย ดังนี้
revenues[1] = 1960000
print(revenues)
# Result will be [1900000, 1960000, 2000000, 2100000, 2200000, 2300000, 2400000]
print(len(revenues))
# Result will be 7
เราสามารถที่จะดำเนินการกับข้อมูลแต่ละตัวได้ด้วยการ loop อ่านข้อมูลทั้งลิสต์ ดังนี้
for i in range(len(revenues)):
print(revenues[i])
ผลลัพธ์ที่ได้จะเป็นค่ารายได้ในลิสต์ในแต่ละปี นอกจากนี้เราสามารถที่จะลบค่าใดๆออกจาก list ได้โดยใช้ method remove ดังนี้
revenues.remove(1960000)
print(revenues)
# Result will be [1900000, 2000000, 2100000, 2200000, 2300000, 2400000]
print(len(revenues))
# Result will be 6
นอกจากนี้เรายังสามารถล้างค่าทั้งหมดในลิสต์ทำให้กลายเป็นลิสตว่างๆได้โดยใช้ method clear ดังนี้
revenues.clear()
print(revenues)
# Result will be []
print(len(revenues))
# Result will be 0
เราสามารถอ้างอิง method ทั้งหมดของ list ได้ที่นี่
นอกจากการเก็บข้อมูลที่เป็นพื้นฐาน (Primitive) เช่นตัวเลข string แล้ว เรายังสามารถที่จะเก็บ list ไว้ภายในลิสต์ได้อีกด้วย เช่นหากเรามีตารางข้อมูลรายได้ในแต่ละปีแล้วเราอยากเก็บข้อมูลปีด้วยวิธีนึงที่เราทำได้คือการใช้ list สองมิติหรือเก็บ list ใน list ดังนี้
annual_revenues = [
[2019, 1900000],
[2020, 2000000],
[2021, 2100000],
[2022, 2200000],
[2023, 2300000]
]
print(annual_revenues)
# Result will be [[2019, 1900000], [2020, 2000000], [2021, 2100000], [2022, 2200000], [2023, 2300000]]
print(annual_revenues[1])
# Result will be [2020, 2000000]
print(annual_revenues[2][0])
# Result will be 2021
print(annual_revenues[2][1])
# Result will be 2100000
จากโค้ดข้างต้น เราทำการสร้างตัวแปร annual_revenues ที่เก็บข้อมูลลิสต์ทั้งหมด 5 ตัว โดยข้อมูลแต่ละตัวก็เป็นลิสต์ที่มีข้อมูลภายใน 2 ตัว ดังนั้นหากเราต้องการข้อมูลของ annual_revenues ตัวที่สอง เราจะเรียก annual_revenues[1] ซึ่งจะได้ผลลัพธ์เป็นค่า [2020, 2000000] ซึ่งหากเราต้องการค่า 2020 เราก็จะอ้างอิง index ที่ 0 อีกครั้ง หรือก็คือ annual_revenues[1][0] ซึ่งก็จะได้ค่า 2020
เราสามารถที่จะเก็บ list ซ้อนกันไปได้ไม่จำกัดชั้น (ขึ้นกับความสามารถในการประมวลผลของเครื่องและความซับซ้อนของโค้ด)
จะเห็นได้ว่า list นั้นเป็นโครงสร้างข้อมูลที่มีประโยชน์มากเพราะในการเขียนโปรแกรมหลายๆครั้งจะเป็นการประมวลผลข้อมูบจำนวนมาก เช่นข้อมูลประวัติลูกค้าซึ่งอาจมีเป็นร้อย เป็นพัน หรือเป็นหมื่น หากเราไม่มีโครงสร้างข้อมูลที่คอยจัดการข้อมูลเหล่านี้ได้อย่างมีประสิทธิภาพการเขียนโค้ดจะทำได้ยากมาก
Tuple ใน Python
Tuple นั้นก็จะเป็นการเก็บข้อมูลในลักษณะเหมือนกับ list คือเก็บรายการชุดข้อมูลไว้ด้วยกัน syntax ในการกำหนด tuple จะเป็นดังนี้
revenues = 1900000, 2000000, 2100000, 2200000, 2300000
# หรือ
revenues = (1900000, 2000000, 2100000, 2200000, 2300000)
ใน python หากเราเขียน 1, 2, 3 python จะมองมันเป็น tuple โดยอัตโนมัติ หรือแม้กระทั่งหากเราเขียน x = 20, python จะมองว่าตัวแปร x เก็บ tuple (20, ) แต่วิธีเขียนให้ชัดเจนโดยใส่ () (เรียกว่า brackets) ครอบ จะทำให้มันชัดเจนขึ้นว่าเป็น tuple แล้วไม่ทำให้เราสับสนในอนาคตเมื่อเรากลับมาอ่าน
ความแตกต่างสำคัญระหว่าง list กับ tuple คือ list จะเป็นโครงสร้างข้อมูลที่ mutable ในขณะที่ tuple นั้น immutable โดยการที่ list เป็น mutable ก็หมายความว่าเราสามารถที่จะเพิ่ม, แก้ไข หรือลบข้อมูลในลิสต์ได้ตลอดเวลา ในทางกลับการ tuple ซึ่งเป็น immutable นั้นจะไม่สามารถทำการปรับเปลี่ยนข้อมูลได้เลยหลังจากกำหนดค่าขึ้นมาแล้วครั้งแรก
ถ้ามันเป็นแบบนั้น หลายๆคนคงตั้งคำถามว่าทำไมไม่ใช้ list ไปเลยง่ายกว่าตั้งเยอะ คำตอบก็คือใช่ครับ ในการเขียนโปรแกรมทั่วๆไปที่ไม่ได้มีขนาดหรือไม่ได้รันบนเครื่องที่มี resource จำกัด การใช้ list ไปเลยทำงานสะดวกกว่ามาก แต่ในโปรแกรมที่มีขนาดใหญ่หรือหากต้องไปใช้งานในเครื่องที่มีข้อจำกัดเรื่อง hardware resources การใช้ tuple ในจังหวะที่ถูกต้องจะทำให้การใช้ Memory ที่น้อยกว่าและทำงานได้เร็วกว่าอีกด้วย ดังนั้นกฎง่ายๆที่เราจะถามตัวเองว่าควรจะใช้ list หรือ tuple นั้นให้ถามว่า ข้อมูลนั้นจะต้องมีการเปลี่ยนแปลงหลังจากกำหนดค่าในครั้งแรกหรือไม่ ถ้าคำตอบคือไม่ก็ให้ใช้ tuple แต่ถ้าคำตอบคือใช่ ก็ให้ใช้ list
หวังว่าบทความนี้จะช่วยให้เราเห็นภาพการใช้งานและความแตกต่างของ list และ tuple นะครับ โอกาสหน้าเราจะมาพูดถึง โครงสร้างพื้นฐานประเภทอื่นๆกันครับ