List (ลิสต์)
Contents
List (ลิสต์)#
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับสตริง (str) ซึ่งเป็นออบเจกต์ประเภทลำดับ (Sequential datatype) ที่เก็บเฉพาะข้อมูลที่เป็นตัวอักษร และทูเพิล (tuple) ซึ่งเป็นออบเจกต์ทั้งประเภท Collections (Container datatype) ที่สามารถเก็บข้อมูลหลายค่าหลายชนิดรวมกันเป็นชุดเดียวกัน และข้อมูลที่เก็บมีการจัดเรียงลำดับโดยใช้เลขดัชนี กันไปแล้ว
ในบทนี้จะอธิบายเกี่ยวกับออบเจกต์ที่เป็นทั้งประเภท Collections และประเภทลำดับอีกตัวหนึ่ง นั่นคือ Lists ซึ่งเป็นข้อมูลเชิงโครงสร้างที่ใช้มากที่สุดในภาษาไพธอน เนื่องจากสามารถเพิ่ม/ลดและแก้ไขข้อมูลได้ (Mutable data structure) ต่างกับ Tuples ซึ่งไม่สามารถแก้เปลี่ยนข้อมูลได้ (Immutable data structure) เราจะทำความรู้จักกับ Lists ว่าคืออะไร เรียนรู้วิธีการประกาศและการใช้งาน Lists เรียนรู้การใช้งานเมธอดและฟังก์ชันต่างๆ ของ Lists และเรียนรู้ความแตกต่างระหว่างการก๊อปปี้ (Copy) และการโคลน (Clone) ของ Lists
Ref:
List (ลิสต์) คือ#
\(\qquad\) ข้อมูลประเภท List (ลิสต์) ถือเป็นจุดเด่นหนึ่งของภาษาไพธอน List เป็นประเภทข้อมูลที่สามารถจัดเก็บออบเจกต์ประเภทต่างๆ ให้เป็นชุด (Heterogeneous container) และมีลำดับ (Sequence Data Type) กล่าวคือ มันสามารถจัดเก็บข้อมูลได้หลายค่าในตัวแปรเดียว โดยข้อมูลที่เก็บจะเป็นชนิดเดียวกันหรือต่างชนิดกัน ก็ได้ (เช่น เก็บทั้งสตริง (str), จำนวนเต็ม (int) และ จำนวนจริง (float) หรือแม้แต่ Tuple และ List รวมกันเป็นข้อมูลชุดเดียวกัน) และสามารถเข้าถึงข้อมูลที่เก็บด้วยเลขดัชนี (Index)
การสร้างลิสต์และเลขดัชนี (Index)#
\(\qquad\) List ในภาษา Python จะคล้ายกับอาเรย์ (array) ในภาษา C หรืออาเรย์/เวกเตอร์ (vevtor)/ลิสต์ (list) ในภาษา C++ แต่ในภาษา C/C++ ข้อมูลที่เก็บต้องเป็นชนิดเดียวกันทั้งหมด เช่น [1, 2, 3, 4] แต่ List ในภาษา Python เก็บข้อมูลต่างชนิดกันได้ เช่น [1, ‘a’, [1, 2], ‘string’] ทำให้ List ในภาษาไพธอนมีความยืดหยุ่นมากกว่า
มาดูการประกาศและการใช้งาน List ในเบื้องต้นกัน
\(\qquad\) ข้อมูลแบบ List จะถูกเขียนอยู่ในเครื่องหมายวงเล็บเหลี่ยม [ ] (square brackets) (หรือจะเรียกว่า ‘วงเล็บก้ามปู’) และคั่นสมาชิกแต่ละตัวด้วยเครื่องหมาย , (comma)
List syntax:
[value1, value2, value3, value4, value5, ...]
เรามาลองสร้างลิสต์ที่มีสมาชิกทุกตัวเป็นจำนวนเต็ม
# สร้าง list ที่มีสมาชิกเป็นจำนวนเต็ม
[0, 10, 20, 30, 40, 50, 60, 70, 80,90, 100]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
สร้างตัวแปรลิสต์ที่มีสมาชิกทุกตัวเป็นจำนวนเต็ม
# สร้างตัวแปร list ที่มีสมาชิกเป็นจำนวนเต็ม
numbers = [0, 10, 20, 30, 40, 50, 60, 70, 80,90, 100]
numbers
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
ชนิดข้อมูลของลิสต์คือ list (และยังเป็นชื่อของฟังก์ชัน (list()) ที่ใช้ในการแปลงข้อมูลชนิดอื่นๆ ใช้เป็น list รายละเอียดจะอธิบายในภายหลัง)
type(numbers)
list
เรามาลองสร้างตัวแปรลิสต์อีกตัวที่สมาชิกทั้งหมดเป็นสตริง และ boolean
# สร้าง list ที่มีสมาชิกเป็นสตริง
languages = ["Python", "C", "C++", "Java", "Perl", "HTML, CSS", "JavaScript"]
languages
['Python', 'C', 'C++', 'Java', 'Perl', 'HTML, CSS', 'JavaScript']
# สร้าง list ที่มีสมาชิกเป็น boolean
boolList = [True, False]
boolList
[True, False]
เราสามารถสร้าง List ที่ไม่มีสมาชิก (Empty list) ก็ได้ ดังนี้
# List ที่ไม่มีสมาชิก (Empty list)
empty = []
empty
[]
Empty list มักถูกใช้เพื่อบันทึกผลระหว่างการรันโปรแกรม รายละเอียดและตัวอย่างการใช้งานจะอธิบายภายหลัง (ในหัวข้อเมธอด append()
)
สมาชิกของลิสต์ไม่จำเป็นต้องเป็นชนิดเดียวกัน
mixedList = ["Katy Perry", 10.1, 2017]
mixedList
['Katy Perry', 10.1, 2017]
เราสามารถใช้เลขดัชนีปรกติ (Index) และ เลขดัชนีเชิงลบ (Negative index) เข้าถึงสมาชิกใน List ได้ เช่นเดียวกับ สตริงและ Tuple
# ใช้คำสั่ง print แสดงสมาชิกแต่ละตัวที่อยู่ในลิสต์โดยใช้เลขดัชนี้ปรกติ(Index) และ เลขดัชนีเชิงลบ (Negative index)
# ซึ่งจะได้ผลลัพธ์เหมือนกัน
print('We get the same element using negative and positive indexing:\n Postive: ',mixedList[0],
'\n Negative:' , mixedList[-3] )
print('We get the same element using negative and positive indexing:\n Postive: ',mixedList[1],
'\n Negative:' , mixedList[-2] )
print('We get the same element using negative and positive indexing:\n Postive: ',mixedList[2],
'\n Negative:' , mixedList[-1] )
We get the same element using negative and positive indexing:
Postive: Katy Perry
Negative: Katy Perry
We get the same element using negative and positive indexing:
Postive: 10.1
Negative: 10.1
We get the same element using negative and positive indexing:
Postive: 2017
Negative: 2017
List ต่างกับ Tuple ตรงที่ เป็นข้อมูลที่เปลี่ยนแปลงได้ (Mutable) นั่นคือองค์ประกอบรายการที่จัดทำดัชนีสามารถแก้ไขได้โดยใช้โอเปอร์เรเตอร์ =
mixedList[0] = "Maroon 5"
mixedList
['Maroon 5', 10.1, 2017]
สมาชิกของ list นอกจากจะเป้นข้อมูลชนิดสตริง (str), จำนวนจริง (float) และจำนวนเต็ม (int) แล้ว ยังสามารถเป็นออบเจกต์ใดๆ ก็ได้ ไม่ว่าจะเป็น Tuple, List, Nested Tuple, Nested List หรือแม้แต่ข้อมูลที่มีโครงสร้างอื่นๆ ก็ได้
# ตัวอย่าง list ที่มีสมาชิกเป็น str, float, int, list, tuple, nested list, nested tuple
nestedList = ["Katy Perry", 10.1, 2017, [1, 2], ("B", 2), [[1, 2]], (("B", 2))]
nestedList
['Katy Perry', 10.1, 2017, [1, 2], ('B', 2), [[1, 2]], ('B', 2)]
หลักการของเลขดัชนี (Index) ใช้กับ Nested Tuple/List ได้ (เหมือนกับ tuples)
nestedList[3]
[1, 2]
nestedList[3][1]
2
ตัวดำเนินการของ Lists#
การเชื่อมด้วยโอเปอร์เรเตอร์ +
(Concatenation operator)#
\(\qquad\) เราสามารถใช้โอเปอร์เรเตอร์ +
เชื่อม lists เข้าด้วยกัน (ผลลัพธ์เป็น list)
list1 = [1, 2, 3]
list2 = [2, 3, 4]
list3 = [3, 4, 5]
list1 + list2 + list3
[1, 2, 3, 2, 3, 4, 3, 4, 5]
การทำซ้ำด้วยโอเปอร์เรเตอร์ *
(Repetition operator)#
\(\qquad\) เช่นเดียวกับสตริง ตัวดำเนินการ *
จะทำการเชื่อมลิสต์ตัวเดิมซ้ำตามจำนวนเลขที่ระบุ (ผลลัพธ์เป็น list)
list1*2
[1, 2, 3, 1, 2, 3]
list1*2+['cheese']
[1, 2, 3, 1, 2, 3, 'cheese']
โอเปอร์เรเตอร์เปรียบเทียบ (Comparison Operator)#
\(\qquad\) เราสามารถใช้ตัวดำเนินการเปรียบเทียบของไพธอน เช่น <, >, ==, !=
เปรียบเทียบระหว่าง list กับ list
อีกตัวได้
โดย List ที่เปรียบเทียบกันต้องมีสมาชิกที่เป็นประเภทข้อมูลที่สามารถเปรียบเทียบกันได้ มิฉะนั้น จะเกิดข้อผิดพลาด เช่น [100] > [‘A’] จะเกิดข้อผิดพลาด (เนื่องจาก int’ กับ ‘str’ เป็นคนละประภทกัน เปรียบเทียบกันไม่ได้)
ผลลัพธ์ของการเปรียบเทียบจะเป็น True
หรือ False
โดยจะเปรียบเทียบสมาชิกตัวแรกของแต่ละลิสต์ก่อน ถ้ามีค่าเท่ากัน จะเปรียบเทียบสมาชิกตัวถัดไปเรื่อยๆ ไป (เทียบเป็นคู่ๆ) จนกว่าจะเจอสมาชิกที่มีค่าไม่เท่ากัน หลังจากนั้นจะเปรียบเทียบสมาชิกที่มีค่าไม่เท่ากันว่า มากกว่า หรือน้อยกว่า หรือ…. ตามโอเปอร์เรเตอร์นั้นๆ
ตัวอย่างต่อไปนี้ เป็นการเปรียบเทีบสิลต์ [3.1415, 1.6180, 2.7182 , 0] (เป็นค่าของ Pi, The Golden Ratio, Euler’s Constant และ zero ตามลำดับ) ว่ามีค่ามากว่าลิสต์ [6.626068E-34, 6.0221515E23, 1.380650E23] (เป็นค่า Planck’s Constant (\(m^2kg/s\)), Avogadro’s Constant และ Boltzmann’s Constant (\(joule/K\))]) หรือไม่
# [Pi, The Golden Ratio, Euler's Constant, zero] > [Planck's Constant (m^2 kg/s), Avogadro's Constant, Boltzmann's Constant (joule/K)]
[3.1415, 1.6180, 2.7182 , 0] > [6.626068E-34, 6.0221515E23, 1.380650E23]
True
ผลลัพธ์เป็น True
เนื่องจาก
จะเปรียบเทียบสมาชิกตัวแรกของทั้งสองลิสต์ก่อน ซึ่ง 3.1415 ไม่เท่ากับ 6.626068E-34 จึงประมวลผลตามโอเปอร์เรเตอร์ ว่า 3.1415 > 6.626068E-34 หรือไม่ ทำให้ผลลัพธ์เป็น True
การตัด (Slicing)#
\(\qquad\) เราสามารถตัด (Slicing) List ได้เช่นเดียวกับการตัด tuples โดยผลของการตัดยังคงเป็นลิสต์
# ตัวอย่าง List
mixedList = ["Katy Perry", 10.1,2017,"KP",1]
mixedList
['Katy Perry', 10.1, 2017, 'KP', 1]
ถ้าเราต้องการสมาชิกแค่สองตัวสุดท้าย เราจะใช้คำสั่งต่อไปนี้
mixedList[3:5]
['KP', 1]
หรือจะเขียนโดยใช้ฟังก์ชัน len()
แทน แบบนี้ก็ได้เช่นกัน
mixedList[len(mixedList)-2:len(mixedList)]
['KP', 1]
ตัวดำเนินการตรวจสอบสมาชิก (Membership operators)#
\(\qquad\) ตัวดำเนินการที่ใช้ตรวจสอบว่า ค่าที่เราต้องการตรวจสอบมีอยู่ในออบเจ็กต์ปลายทางหรือไม่ มีอยู่ 2 ตัว คือ
* **ตัวดำเนินการ `in`** ใช้ตรวจสอบว่า ค่าที่เราต้องการมีอยู่ในออบเจ็กต์ปลายทางใช่หรือไม่ โดยจะคืนค่าเป็น True ในกรณีที่มีค่าที่ระบุอยู่ในออบเจ็กต์ปลายทาง เช่น
my_favorite_lang = ["Python", "Swift"]
print("Python" in my_favorite_lang) # คืนค่าเป็น True เพราะมี "Python" อยู่ในตัวแปร my_favorite_lang
* **ตัวดำเนินการ `not in`** ใช้ตรวจสอบว่า ไม่มีค่าที่เราระบุอยู่ในออบเจ็กต์ปลายทางใช่หรือไม่ โดยจะคืนค่าเป็น True ในกรณีที่ไม่มีค่าที่ระบุอยู่ในออบเจ็กต์ปลายทาง เช่น
my_favorite_lang = ["Python", "Swift"]
print("Kotlin" not in my_favorite_lang) # คืนค่าเป็น True เพราะไม่มี "Kotlin" อยู่ในตัวแปร my_favorite_lang
# สร้างตัวแปรลิสต์
pop_list = ['pop','pop rock','dance pop','electropop','teen pop']
# ตรวจสอบว่าค่าที่ระบุเป็นสมาชิกของลิสต์ pop_list หรือไม่
"pop" in pop_list
True
# ตรวจสอบว่าค่าที่ระบุเป็นสมาชิกของสตริงหรือไม่
'!' in 'Hello python'
False
[Exercise] ลิสต์ - การสร้าง เลขดัชนีและตัวดำเนินการ#
1
จงสร้างตัวแปรลิสต์ frontend
ที่ประกอบด้วยสมาชิก “HyperText Markup Language (HTML)”, “Cascading Style Sheets (CSS)”, “JavaScript”, “React”, “Angular”, “React” แล้วแสดงผลลัพธ์ออกหน้าจอ
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
frontend = ["HyperText Markup Language (HTML)", "Cascading Style Sheets (CSS)", "JavaScript", "React", "Angular", "React"]
print(frontend)
['HyperText Markup Language (HTML)', 'Cascading Style Sheets (CSS)', 'JavaScript', 'React', 'Angular', 'React']
2
จากข้อก่อนหน้า จงเขียนโค้ดเพิ่มภาษา “Swift” เข้าไปในลิสต์ frontend
โดยใช้โอเปอร์เรเตอร์ +
แล้วแสดงผลลัพธ์ออกหน้าจอ
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
frontend = frontend + ["Swift"]
# frontend.append("Swift") # หรือจะใช้เมธอด append() ก็ได้ (รายละเอียดอยู่ในหัวข้อถัดไป)
print(frontend)
['HyperText Markup Language (HTML)', 'Cascading Style Sheets (CSS)', 'JavaScript', 'React', 'Angular', 'React', 'Swift']
3
จากข้อก่อนหน้า จงเขียนโค้ดแสดงขนาดข้อมูลที่เก็บอยู่ในในลิสต์ frontend
ออกหน้าจอ
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
print(len(frontend))
7
4
จากข้อก่อนหน้า จงสร้างตัวแปร secondElement
ที่เก็บค่าของสมาชิกตัวที่ 2 ของลิสต์ frontend
แล้วแสดงผลออกหน้าจอ
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
secondElement = frontend[1]
print(secondElement)
Cascading Style Sheets (CSS)
5
จากข้อก่อนหน้า จงเขียนโค้ดแสดงเฉพาะตัวย่อ CSS
ที่อยู่ในสมาชิกตัวที่ 2 ของตัวแปรลิสต์ frontend
ออกหน้าจอ
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
print(frontend[1][24:27])
CSS
6
จากข้อก่อนหน้า จงเขียนโค้ดตรวจสอบว่า ‘Cascading Style Sheets (CSS)’ และ ‘CSS’ เป็นสมาชิกของลิสต์ frontend
หรือไม่
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
print("Cascading Style Sheets (CSS) in frontend?", 'Cascading Style Sheets (CSS)' in frontend)
print("CSS in frontend?",'CSS' in frontend)
Cascading Style Sheets (CSS) in frontend? True
CSS in frontend? False
ฟังก์ชันและเมธอดของ Lists#
\(\qquad\) List มีฟังก์ชันและเมธอดมาตรฐาน (built-in functions/methods) หลากหลาย
ฟังก์ที่ใช้ดำเนินการกับลิสต์เป็นฟังก์ชั่นที่อยู่ในไลบรารีมาตรฐานของ Python ช่วยทำให้เขียนโปรแกรมทำได้ง่ายขึ้น เร็วขึ้นและมีประสิทธิภาพมากขึ้น ฟังก์ชันของลิสต์ที่สำคัญๆ มีดังต่อไปนี้
การหาจำนวนสมาชิกด้วยฟังก์ชัน len()
\(\qquad\) len()
เป็นฟังก์ชันที่ใช้หาจำนวนหรือขนาดของออบเจ็กต์ใดๆ ถ้าใช้กับลิสต์จะส่งกลับเป็นจำนวนสมาชิกที่อยู่ในสลิสต์ (ถ้าใช้กับ tuple และสตริง จะส่งค่ากลับเป็นจำนวนสมาชิกที่อยู่ในทูเพิล และจำนวนตัวอักขระในสตริง ตามลำดับ)
Syntax:
len(list)
ลิสต์ numbers
มีขนาดหรือมีจำนวนสมาชิกอยู่ทั้งหมด 11 สมาชิก
numbers = [0, 10, 20, 30, 40, 50, 60, 70, 80,90, 100]
len(numbers)
11
การหาผลรวมด้วยฟังก์ชัน sum()
\(\qquad\) ฟังก์ชัน sum()
ใช้หาผลรวมของสมาชิกที่อยู่ในลิสต์ที่กำหนด ใช้ได้เฉพาะกับลิสต์มีค่าเป็นตัวเลขเท่านั้น
Syntax:
sum(numeric_list))
ผลรวมของสมาชิกที่อยู่ในลิสต์ numbers
คือ 550
print(sum(numbers)) # 0 + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 90 + 100 ผลรวมเท่ากับ 550
550
การหาค่ามากสุดและน้อยสุดด้วยฟังก์ชัน max(), min()
\(\qquad\) ฟังก์ชัน max()
และ min()
จะส่งค่ากลับเป็นสมาชิกที่อยู่ในลิสต์ที่มีค่ามากที่สุด และน้อยที่สุดที่ ตามลำดับ โดยสมาชิกที่อยู่ในลิสต์ต้องเป็นข้อมูลที่สามารถเปรียบเทียบกันได้ เช่น มีสมาชิกเป็นตัวเลข max([5,10.9,11,0]): 11 หรือมีสมาชิกเป็นสตริง min([‘apple’, ‘mango’, ‘banana’]): ‘apple’ แต่ถ้าสมาชิกเป็นตัวเลขปนกับสตริง [5,’apple’,11,’mango’] จะเปรียบเทียบกันไม่ได้ (เกิด Error)
Syntax:*
max(list)
min(list)
ลิสต์ numbers
ข้างต้น มีสมาชิกที่มีค่ามากที่สุดและน้อยที่สุดคือ 100 และ 0 ตามลำดับ
print("max(numbers) =", max(numbers))
print("min(numbers) =", min(numbers))
max(numbers) = 100
min(numbers) = 0
คำสั่งข้างต้นเป็นการเขียนโดยการส่ง max(numbers)
และ min(numbers)
เป็นอาร์กิวเมนต์ให้กับฟังก์ชัน print()
แต่เราสามาระเขียนเป็น f-string ในรูปแบบ f'{expr=}'
แบบนี้ก็ได้ (รายละเอียดของ f-string อยู่ในหัวข้อ การใช้ฟังก์ชัน print( ) แสดงผลของตัวแปร (นิพจน์))
print(f"{max(numbers) = }")
print(f"{min(numbers) = }")
max(numbers) = 100
min(numbers) = 0
การแปลงข้อมูลด้วยฟังก์ชัน list()
\(\qquad\) ฟังก์ชัน list()
เป็นฟังก์ชันที่ใช้แปลงข้อมูลประเภทลำดับ (sequence หรือ iterable) เช่น สตริง (str) ทูเพิล (tuple) ดิกชันนารี (dict) ให้เป็นข้อมูลประเภท List
Syntax:
list(iterable)
Iterable1 คือ ออบเจกต์ใดๆ ที่สามารถทำการวนซ้ำกับมันได้ (ออบเจกต์ที่ไล่วนลูปซ้ำๆ ได้) ยกตัวอย่างเช่น Lists, Tuples หรือแม้แต่ Strings ก็ถือเป็น Iterable เช่นกัน
str1= "abcdefg" # ตัวแปรชนิด str
tuple1=(5, 12, 13) # ตัวแปรชนิด tuple
dict1={ "a":1, "b":2, "c":3} # ตัวแปรชนิด dict
print(list(str1)) # แปลงข้อมูล str ให้เป็น list
print(list(tuple1)) # แปลงข้อมูล tuple ให้เป็น list
print(list(dict1)) # แปลงข้อมูล dict ให้เป็น list
print(f"{list(str1) = }")
['a', 'b', 'c', 'd', 'e', 'f', 'g']
[5, 12, 13]
['a', 'b', 'c']
list(str1) = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
Important
ฟังก์ชัน list() ใช้แปลงข้อมูลจากข้อมูลที่เปลี่ยนแปลงไม่ได้ (Immutable datatypes) ให้เป็นข้อมูลที่เปลี่ยนแปลงได้ (Mutable datatypes) ได้
การค้นหาสมาชิกด้วยเมธอด Index( )
\(\qquad\) เมธอด index( )
ใช้ค้นหาสมาชิกที่อยู่ในลิสต์ โดยส่งกลับเป็นเลขดัชนีของสมาชิกในลิสต์ (ในกรณีที่มีค่าของสมาชิกมีซ้ำกัน จะส่งคืนเฉพาะตำแหน่งแรกที่เจอ และในกรณีที่ไม่มีอยู่ในลิสต์ จะเกิด Error)
Syntax:
list.index(element)
โดยคืนค่ากลับเป็นเลขดัชนีของสมาชิก (element) ที่ต้องการค้นหา
‘KP’ อยู่ในลิสต์ mixedList
และอยู่ในตำแหน่งที่ 4 (เลขดัชนีเป็น 3)
mixedList = ["Katy Perry", 10.1,2017,"KP",1]
mixedList.index('KP')
3
เนื่องจาก List จัดเก็บข้อมูลเป็นลำดับ เราสามารถจัดเรียงลำดับ List ย้อนกลับ (จากสมาชิกตัวท้ายสุดย้อนกลับมาตัวแรก) ได้โดยใช้วิธีเดียวกับสตริงและ Tuple
# Syntax เรียงลำดับ List ย้อนกลับ ซึ่งเป็นวิธีเดียวกับสตริงและ Tuple
mixedList[::-1]
[1, 'KP', 2017, 10.1, 'Katy Perry']
‘KP’ ยังคงอยู่ในลิสต์ mixedList[::-1]
แต่อยู่ในตำแหน่งที่ 2 (เลขดัชนีคือ 1)
mixedList[::-1].index('KP')
1
การเพิ่มสมาชิก (หลายตัว) ด้วยเมธอด extend( )
\(\qquad\) เราสามารถใช้เมธอด extend( )
เพิ่มสมาชิกหลายตัวต่อท้าย List ที่ต้องการได้
Syntax:
list.extend(iterable)
โดยเพิ่ม iterable (list, tuple, str ฯลฯ) ต่อท้ายลิสต์ (เป็นการเพิ่มสมาชิกใหม่หลายตัวต่อท้าย)
# ใช้เมธอด extend() เพิ่มสมาชิกหลายตัวให้กับลิสต์
L = [ "Katy Perry", 10.2]
L.extend(['pop', 10])
L
['Katy Perry', 10.2, 'pop', 10]
extend()
จะเป็นการเพิ่มสมาชิกใหม่สองตัว (ของลิสต์ ['pop', 10]
) เข้าไปใน List L
การเพิ่มสมาชิก (สมาชิกเดียว) ด้วยเมธอด append()
\(\qquad\) อีกเมธอดที่คล้ายกันคือ append()
ถ้าเราใช้ append()
2 แทน extend()
3 จะเป็นการเพิ่มสมาชิกแค่สมาชิกเดียว (Nested List)
Syntax:
list.append(item)
โดยเพิ่ม item (ตัวเลข สตริง ลิสต์ ทูเพิล ฯลฯ) ต่อท้ายลิสต์ (เป็นการเพิ่มสมาชิกใหม่แค่สมาชิกเดียวต่อท้าย)
# ใช้ append เพิ่มสมาชิกให้กับลิสต์
L = [ "Katy Perry", 10.2]
L.append(['pop', 10])
L
['Katy Perry', 10.2, ['pop', 10]]
append()
จะเป็นการเพิ่มสมาชิกใหม่เพียงตัวเดียว (ลิสต์ ['pop', 10]
) เข้าไปใน List L
(กลายเป็น Nested List)
ถ้าเราสังเกต ทุกครั้งที่มีการเรียกใช้เมธอด extend() หรือ append() ค่าที่เก็บไว้ใน List จะเปลี่ยน!
ความแตกต่างระหว่าง extend()
และ append()
หากถ้าต้องการเพิ่มสมาชิกหลายตัวต่อท้าย List เช่น เพิ่มสมาชิกแต่ละตัวที่อยู่ในทูเพิล b
(3,4) ต่อท้าย List a
[1,2] ให้ใช้เมธอด extend()
a = [1, 2]
b = (3,4)
a.extend(b) # a จะเปลี่ยนเป็น [1, 2, 3, 4]
print('a.extend((3,4)): ', a)
a = [1, 2]
b = (3,4)
a.append(b) # a จะเปลี่ยนเป็น [1, 2, (3, 4)]
print('a.append((3,4)): ',a)
a.extend((3,4)): [1, 2, 3, 4]
a.append((3,4)): [1, 2, (3, 4)]
แต่ถ้าหากต้องการเพิ่มสมาชิกเพียงแค่สมาชิกเดียวต่อท้าย List เช่น เพิ่มสตริงค์ '30-Nov-17'
เป็นสมากชิกใหม่ (เพื่มทั้งสตริงค์ให้เป็นสมาชิกเดียว) ต่อท้ายลิสต์ L
ให้ใช้เมธอด extend()
L = ["Katy Perry", 10.2]
date = '30-Nov-17'
L.extend(date)
print("L.extend('30-Nov-17'): ", L)
L = ["Katy Perry", 10.2]
date = '30-Nov-17'
L.append(date)
print("L.append('30-Nov-17'): ", L)
L.extend('30-Nov-17'): ['Katy Perry', 10.2, '3', '0', '-', 'N', 'o', 'v', '-', '1', '7']
L.append('30-Nov-17'): ['Katy Perry', 10.2, '30-Nov-17']
ผลลัพธ์ของโค้ด L.extend('30-Nov-17')
ข้างต้นและผลลัพธ์ต่อไปนี้เป็นการเพิ่มทีละตัวอักษรของข้อความ ‘30-Nov-82’ แทนที่จะเป็นแค่ข้อความเดียว เนื่องจากเป็น str ซึ่งเป็นข้อมูลชนิด Iterable
L = ["Katy Perry", 10.2]
L += '30-Nov-17' # L += ['30-Nov-82'] # เพิ่มทีละตัวอักษร
L
['Katy Perry', 10.2, '3', '0', '-', 'N', 'o', 'v', '-', '1', '7']
\(\qquad\) Tuple จะคล้ายกับ List แต่สิ่งที่แตกต่างกันคือ Tuple นั้นเป็นประเภทข้อมูลที่ไม่สามารถเปลี่ยนแปลงได้ (Immutable)4 ในขณะที่ List เป็นประเภทข้อมูลที่สามารถเปลี่ยนแปลงได้ (Mutable)5
เราสามารถเปลี่ยนค่าของสมาชิกใน List ได้ ดังตัวอย่างต่อไปนี้
# เปลี่ยนค่าของสมาชิกโดยใช้เลขดัชนี
A = ["dance", 10, 1.2]
print('Before change:', A)
A[0] = 'pop rock'
print('After change:', A)
Before change: ['dance', 10, 1.2]
After change: ['pop rock', 10, 1.2]
จะเปลี่ยนค่าของสมาชิกทีละหลายๆ ค่าพร้อมกันก็ได้ ดังตัวอย่างต่อไปนี้ (เปลี่ยน 2 ตัวแรก)
# การแก้ไขค่าของสมาชิกหลายๆ ตัวพร้อมกัน
A = ["dance", 10, 1.2]
print('Before change:', A)
A[0:2] = 'pop rock',9
print('After change:', A)
Before change: ['dance', 10, 1.2]
After change: ['pop rock', 9, 1.2]
การเปลี่ยนสตริงให้เป็น list
\(\qquad\) เราสามารถแปลงข้อความ(สตริง)ให้เป็น List ได้โดยใช้เมธอดสตริง split( )
เมธอด split( )
จะตัดสตริงยาวๆ ออกเป็นคำๆ (Words) ถ้าไม่กำหนดตัวอักษรในการตัด แต่ละคำถูกจะถูกตัดด้วยอักขระ space (เว้นวรรค) โดยปริยาย และคำแต่ละคำที่ถูกตัดจะถูกเก็บเป็นสมาชิกของ List
# การตัดสตริงค์ด้วยเมธอด split( ) มีค่าเริ่มต้นในการตัด คือ space
'pop rock'.split()
['pop', 'rock']
เราสามารถกำหนดอักขระที่เป็น ตัวคั่น (Delimiter) เองก็ได้ โดยการส่งอาร์กิวเมนต์ระบุตัวคั่นให้กับฟังก์ชัน split( )
ตัวอย่างต่อไปนี้ เป็นการกำหนดตัวคั่นเป็นเครื่องหมายจุลภาค , (comma)
# การตัดสตริงค์ด้วยเครื่องหมายจุลภาค
'A,B,C,D'.split(',')
['A', 'B', 'C', 'D']
การลบข้อมูลด้วยคีย์เวิร์ด del
\(\qquad\) del
6 เป็นคีย์เวิร์ดในภาษาไพธอน ย่อมาจาก delete เราใช้คีย์เวิร์ด del
ลบออบเจ็กต์ ดังนั้นสามารถใช้เพื่อลบตัวแปรที่เป็น int float str tuple list ฯลฯ ได้
เช่น ตัวแปร A
ข้างต้นเป็นลิสต์ และมีค่าเป็น
print(A)
['pop rock', 9, 1.2]
แต่ถ้าเรารันคำสั่ง del A
แล้วรันคำสั่งเดิมซ้ำ จะเกิดข้อผิดพลาด (NameError) เนื่องจากตัวแปร A
ถูกลบทิ้งไปแล้ว
del A
print(A)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In [52], line 2
1 del A
----> 2 print(A)
NameError: name 'A' is not defined
นอกจากนี้ เรายังสามารถใช้คีย์เวิร์ด del
ลบเฉพาะบางสมาชิกที่เข้าถึงได้ด้วย index เช่น สมาชิกของ List ได้อีกด้วย (แต่ไม่สามารถลบตัวอักษรของ string หรือสมาชิกของ tuple ได้ เนื่องจากทั้งคู่เป็นออบเจ็กต์ชนิด immutables (แต่ยังคง สามารถลบทั้งออบเจ็กต์ทิ้งได้)
# การลบสมาชิกโดยใช้เลขดัชนี
A = ["dance", 10, 1.2]
print('Before change:', A)
del(A[0])
print('After change:', A)
และยังสามารถลบสมาชิกได้หลายตัวโดยใช้การตัด (Slicing)
# การลบสมาชิกหลาบๆ ตัวโดยใช้การตัด (Slicing)
A = ["dance", 10, 1.2]
print('Before change:', A)
del(A[0:2])
print('After change:', A)
การก๊อปปี้ (Copy) / การโคลนนิ่ง (Cloning) Lists#
\(\qquad\) กรณีที่เรากำหนดตัวแปร B
ให้เท่ากับตัวแปรลิสต์ A
(โดยใช้โอเปอเรเตอ์ =
; B = A
) ตัวแปรลิสต์ทั้งสอง A
และ B
จะอ้างอิง (Reference) ข้อมูล List ตัวเดียวกันในหน่วยความจำ
# การก๊อปปี้ (การก๊อปปี้โดยการอ้างอิง) ลิสต์ A
A = ["pop rock", 10, 1.2]
B = A
print('A:', A)
print('B:', B)
A: ['pop rock', 10, 1.2]
B: ['pop rock', 10, 1.2]
เนื่องจากตัวแปรลิสต์ทั้งสองอ้างอิง List ตัวเดียวกัน (ชี้ไปยัง List ตัวเดียวกัน) ดังนั้น ถ้าตัวแปรตัวใดตัวหนึ่งมีการเปลี่ยนค่า ตัวแปรตัวที่เหลือค่าก็จะเปลี่ยนไปด้วย
# ตรวจสอบการก๊อปปี้โดยการอ้างอิง ข้อมูลของตัวแปรไม่เป็นอิสระต่อกัน
print('B[0]:', B[0])
A[0] = "banana"
print('B[0]:', B[0])
B[0]: pop rock
B[0]: banana
ดังแสดงในรูปต่อไปนี้
ฉะนั้น การก๊อปปี้ตัวแปรลิสต์ด้วยโอเปอร์เรเตอร์ =
จึงไม่ได้เป็นการก๊อปปี้ด้วยค่าของข้อมูล (Copy by value) แต่เป็นการก๊อปปี้โดยการอ้างอิง (Copy by reference) กล่าวคือ เป็นเพียงการกำหนดตำแหน่งในหน่วยความจำให้กับตัวแปร เท่านั้น
อย่างไรก็ตาม เราสามารถก๊อปปี้ค่าของข้อมูลหรือที่เรียกว่า การโคลนนิ่ง (Cloning) ลิสต์ได้หลากหลายวิธี แต่วิธีที่ง่ายที่สุดคือการใช้การตัด (slicing) ลิสต์ โดยมี syntax ดังนี้
Syntax:
new_list = old_list[:]
# การโคลนนิ่ง (Cloning) ลิสต์ A โดยการตัด (Slicing)
A = ["pop rock", 10, 1.2]
B = A[:]
B
['pop rock', 10, 1.2]
ตัวแปร B จะอ้างอิงกับ List ใหม่ที่โคลนค่าของสมาชิกทุกตัวที่อยู่ใน List ต้นฉบับ
ในกรณีนี้ตัวแปลทั้งสองจะเป็นอิสระต่อกัน ลองเปลี่ยนลิสต์ A
ลิสต์ B
จะไม่เปลี่ยนตาม
print(f'{A=}')
print(f'{B=}')
A[0] = "banana"
print('After running this code: A[0] = "banana"')
print(f'{A=}')
print(f'{B=}')
A=['pop rock', 10, 1.2]
B=['pop rock', 10, 1.2]
After running this code: A[0] = "banana"
A=['banana', 10, 1.2]
B=['pop rock', 10, 1.2]
Note
การโคลน (Cloning) เป็นการสร้างออบเจ็กต์ตัวใหม่ขึ้นมา ดังนั้น List A
กับ List B
เป็นอิสระต่อกัน ถือเป็นออบเจ็กต์คนละตัวกัน
[Exercise] ฟังก์ชันและเมธอดของลิสต์#
1.
การสร้างตัวแปรลิสต์และการเข้าถึงข้อมูลของลิสต์
1.1) จงสร้างตัวแปร List a_list
ทีมีสมาชิกต่อไปนี้ 1
, 'hello'
, [1,2,3]
และ True
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
1.2)
จงเขียนโค้ดเข้าถึงสมาชิกที่มีเลขดัชนีเป็น 1
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
a_list[1]
1.3)
จงดึงสมาชิกที่มีเลขดัชนีเป็น 1, 2 และ 3 ออกจาก a_list
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
a_list[1:4]
2.
จงเขียนโค้ดรวมสมาชิกที่อยู่ในลิสต์ A = [1, 'a']
และสมาชิกที่อยู่ในลิสต์ B = [2, 1, 'd']
เข้าด้วยกัน
# เขียนโค้ดต่อด้านล่าง แล้วกด Shift+Enter
A = [1, 'a']
B = [2, 1, 'd']
Click here for the solution
A = [1, 'a']
B = [2, 1, 'd']
A + B
หรือ
A = [1, 'a']
B = [2, 1, 'd']
A.extend(B)
print(A)
3.
กำหนดให้
C = [5, 22/7, 3.14159, True]
และ D = [True, 5, 22/7, 3.14159]
จงเขียนโค้ดตรวจสอบผลลัพธ์ของ C กับ D ว่าเท่ากันหรือไม่
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
C = [5, 22/7, 3.14159, True]
D = [True, 5, 22/7, 3.14159]
C == D
4.
จากข้อก่อนหน้า จงเขียนโค้ดตรวจสอบผลลัพธ์ของ C หลังเรียงลำดับจากน้อยไปมาก กับ D หลังเรียงลำดับจากน้อยไปมาก ว่าเท่ากันหรือไม่
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
C.sort()
D.sort()
C == D
5.
จากข้อก่อนหน้า จงเขียนโค้ดตรวจสอบผลลัพธ์ว่า ‘22/7’ เป็นสมาชิกของ C หรือไม่
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
print('22/7' in C)
6.
กำหนดให้ตัวแปรสตริงค์ quote
เก็บข้อความต่อไปนี้
quote = 'Where There is a Will There is a Way'
จงตัดข้อความข้างต้นให้เป็นคำๆ เป็นลิสต์
# เขียนโค้ดด้านล่าง แล้วกด Shift+Enter
Click here for the solution
newton_quote = 'Where There is a Will There is a Way'
newton_quote.replace(',', '').replace(';', '').split()
Change Log#
Date |
Version |
Change Description |
---|---|---|
08-08-2021 |
0.1 |
First edition |
05-05-2022 |
0.2 |
Fix the typo, minor change |
- 1
Iterate (iter-able) adjective สามารถทำซ้ำได้ noun: (programming) ออบเจ็กต์ที่สามารถทำการวนซ้ำได้
- 2
append verb: ผนวกเข้า,ห้อยท้าย
- 3
extend verb: ขยายออก, ยืดออก
- 4
Immutable Objects เช่น List, Dictionary, Set
- 5
Mutable Objects เช่น Int, Float, String, Tuple, Frozen Set
- 6
โดยทั่วไป คนส่วนใหญ่เข้าใจว่า คีย์เวิร์ด del ใช้ในการลบออบเจ็กต์ออกจากหน่วยความจำ แต่ในความเป็นจริง
del
ไม่ได้ลบออบเจ็กต์ และเป็นการลบชื่อตัวแปร ออกจากเนมสเปซ (Namespaces)