ลิสต์ (Lists)
ความหมายของลิสต์
ลิสต์ (List) เป็นโครงสร้างข้อมูลที่สำคัญมากของภาษาไพทอนคล้ายคลึงกับ Array
ในภาษาอื่นๆ คือ ชุดของข้อมูลที่เรียงลำดับต่อๆ กัน จะเป็นค่าของอะไรก็ได้ การสร้าง list
โดยกำหนดสัญลักษณ์ []
เช่น t = []
หรือ ดังตัวอย่างต่อไปนี้
>>> t = []
>>> t
[]
>>> type(t)
<class 'list'>
>>> id(t)
55105976
>>> t = list()
ตัวอย่างของการกำหนดค่าใน List เช่น
เป็น list ของตัวเลข
เป็นลิสต์ผสมของตัวเลขและข้อความ
เป็นลิสต์ที่มีลิสต์เป็นองค์ประกอบอยู่ด้วย
กล่าวได้ว่าเราสามารถเอาค่าของหลายๆ ประเภทมาอยู่รวมกันในลิสต์เดียวกันได้ ดังตัวอย่างต่อไปนี้
>>> t = [1,2,3,4,5]
>>> len(t)
5
>>> x = [1,'Mike',1.1,True]
>>> x
[1,'Mike',1.1,True]
>>> len(x)
4
>>> y = [1,['a','b'],True]
>>> y
[1,['a','b'],True]
>>> len(y)
3
การเข้าถึงค่าในลิสต์
ค่าในลิสต์จะเรียงตามตัวชี้หรือ Index ที่เริ่มต้นที่ 0 เช่น t = [0]
และหากมีลิสต์ซ้อนอยู่ในลิสต์จะสามารถแสดงตัวชี้ได้ด้วยการกำหนดตัวชี้หลักตามด้วยตัวชี้ย่อย
เช่น t = [1][0]
ดังตัวอย่างต่อไปนี้
>>> y = [1,['a','b'], True]
>>> y
[1,['a','b'], True]
>>> len(y)
3
>>> t
[1, 2, 3, 4, 5, 6]
>>> t[0]
1
>>> t[1]
2
>>> t[2]
3
>>> y[0]
1
>>> y[1]
['a', 'b']
>>> y[1][0]
'a'
การแบ่งข้อมูลในลิสต์ (List Slicing)
List Slicing หรือการแบ่งข้อมูลในลิสต์เป็นชุดข้อมูลย่อยๆ
จะเขียนในรูปแบบ [a:b]
เมื่อ a เป็น Index เริ่มต้นและ b เป็น Index
ก่อนสมาชิกตัวสุดท้ายที่ต้องการตัด ดังตัวอย่างต่อไปนี้
>>> t = [1, 2, 3, 4, 5, 6]
>>> t[1:3]
[2,3]
>>> t[2:]
[3, 4, 5, 6]
>>> t[:4]
[1, 2, 3, 4]
Lists เปลี่ยนแปลงค่าได้
ลิสต์สามารถเปลี่ยนแปลงค่าได้ ดังตัวอย่างต่อไปนี้
>>> t = [True, 2, 3, 4, 5, 6]
>>> t[1] = 'Hello World'
>>> t
[True, 'Hello World', 3, 4, 5, 6]
>>> t[1]
'Hello World'
การใช้ in
กับลิสต์
การดำเนินการด้วย in
สามารถใช้กับลิสต์ได้ ดังตัวอย่างต่อไปนี้
>>> t = [True, 2, 3, 4, 5, 6]
>>> t[1] = 'Hello World'
>>> t
[True, 'Hello World', 3, 4, 5, 6]
>>> t[1]
'Hello World'
>>> 3 in t
True
การเดินทางไปในลิสต์ (List Traversal)
การใช้ for
loop และตัวดำเนินการ in
ในการเดินทางไปในลิสต์
เป็นดังตัวอย่างต่อไปนี้
fruits = ['banana', 'orange', 'mango']
for fruit in fruits:
print(fruit, end=' ')
ซึ่งผลลัพธ์ที่ได้เป็นดังนี้
banana orange mango
การใช้ฟังก์ชัน range()
กับลิสต์ สำหรับ range()
ของความยาวของตัวแปร
จะถูกนำมาใช้ในการเดินทางด้วย index ในลิสต์ เป็นดังตัวอย่างต่อไปนี้
range()
กับลิสต์for i in range(len(fruits)):
print('{0} = {1}'.format(i, fruits[i]))
ซึ่งผลลัพธ์ที่ได้เป็นดังนี้
range()
กับลิสต์0 = banana
1 = orange
2 = mango
ตัวดำเนินการของลิสต์ (List Operators)
ถ้าต้องการเอาลิสต์มารวมกันให้ใช้เครื่องหมายบวก (+) ถ้าต้องการขยายลิสต์ให้มีค่าชุดเดิมเพิ่มเป็นกี่เท่าตัวให้ใช้เครื่องหมายดอกจัน (*) เป็นดังตัวอย่างต่อไปนี้
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a [1, 2, 3]
>>> b
[4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a * 2
[1, 2, 3, 1, 2, 3]
เมธอดของลิสต์ (List Methods)
การขยายลิสต์ด้วยอีกลิสต์หนึ่ง ให้ใช้คำสั่ง list.extend()
เป็นดังตัวอย่างต่อไปนี้
list.extend()
>>> a
[1, 2, 3]
>>> b
[4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
การเพิ่มค่าในลิสต์ทำได้ด้วยคำสั่ง list.append()
ค่าใหม่ที่ได้จะต่อท้ายตัวสุดท้ายในลิสต์ เป็นดังตัวอย่างต่อไปนี้
list.append()
>>> a.append(7)
>>> a
[1, 2, 3, 4, 5, 6, 7]
การเพิ่มค่าในลิสต์โดยกำหนดตำแหน่งของ index ให้ใช้คำสั่ง
list.insert()
เป็นดังตัวอย่างต่อไปนี้
list.insert()
>>> a.insert(0, 0)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7]
การลบค่าในลิสต์ทำได้ด้วยคำสั่ง list.remove()
เป็นดังตัวอย่างต่อไปนี้
list.remove()
>>> a.remove(7)
>>> a
[0, 1, 2, 3, 4, 5, 6]
นอกจากนี้สามารถลบค่าในลิสต์ได้ด้วยคำสั่ง del โดยจะต้องระบุค่า Index
ของตัวที่ต้องการลบ เช่น del a[0]
เป็นการลบค่าลิสต์ที่มี index 0
หรือถ้าลบเป็นช่วงให้ระบุตำแหน่งเริ่มต้นที่จะลบจนถึงตำแหน่งตัวก่อนสุดท้ายที่จะลบ
del a[2:4]
จะลบตัวที่ 2 และ 3 ในลิสต์
และถ้าลบค่าในลิสต์ออกทั้งหมดให้ใช้คำสั่ง del a[:]
ศึกษาเรื่อง list methods เพิ่มเติมได้ที่ https://docs.python.org/3/tutorial/datastructures.html
Map, reduce, and filter
การสร้าง Map ฟังก์ชัน เป็นการทำให้ลิสต์หนึ่งเป็นอีกลิสต์หนึ่ง
ให้ฟังก์ชันชื่อ capitalize()
รับลิสต์ t
มา แล้ว return ลิสต์
r
แล้วทำการเดินทางในค่าแต่ละค่า
เมื่อเจอค่าก็ให้ทำการประมวลผลเป็นตัวพิมพ์ใหญ่ แล้วเก็บไว้ในลิสต์ r
เป็นดังตัวอย่างต่อไปนี้
map
ฟังก์ชันdef capitalize(t):
r = []
for s in t:
r.append(s.capitalize())
return r
ซึ่งผลลัพธ์ที่ได้เป็นดังนี้
>>> capitalize(['a', 'b', 'c', 'd'])
['A', 'B', 'C', 'D']
การสร้าง Reduce ฟังก์ชันเป็นการประมวลผลลิสต์เพื่อการผลสรุป
ให้ฟังก์ชันชื่อ sum()
รับลิสต์ t
มา แล้ว return ค่า sum
โดยกำหนดตัวแปรชื่อ sum ให้ค่าเป็น 0 แล้วเดินทางไปในลิสต์ทีละค่า
แล้วนำค่าเมื่อบวกกัน เมื่อบวกจนครบทุกตัวแล้วให้ส่งค่ากลับมาเป็น sum
เป็นดังตัวอย่างต่อไปนี้
reduce
ฟังก์ชันdef sum(t):
sum = 0
for x in t:
sum += x
return sum
ซึ่งผลลัพธ์ที่ได้เป็นดังนี้
reduce
ฟังก์ชัน>>> sum([1,2,3,4,5])
15
ฟังก์ชันอีกประเภทหนึ่งเรียกว่า filter ฟังก์ชัน คือการ search แบบรับลิสต์มาแล้ว return ค่า คือมีการค้นหาแล้วทำการประมวลผลค่านั้นๆ หรืออาจจะ return มาเป็นลิสต์ก็ได้ แล้วก็ทำการประมวลผลกับข้อมูลที่อยู่ในลิสต์นั้น เช่น ฟังก์ชันรับลิสต์ t เข้าไป แล้ว return ลิสต์ที่เป็น integer เท่านั้น โดยตั้งต้นสร้างลิสต์ r แล้วเดินทางไปในค่าแต่ละค่าของลิสต์ t ถ้าเจอว่าประเภทของค่าเป็น int ให้ทำการแทรกค่าในลิสต์ r เมื่อทำครบแล้วให้ส่งค่าลิสต์ r ออกมา เป็นดังตัวอย่างต่อไปนี้
filter
ฟังก์ชันdef only_int(t):
r = []
for x in t:
if type(x) == int:
r.append(x)
return r
ซึ่งผลลัพธ์ที่ได้เป็นดังนี้
filter
ฟังก์ชัน>>> only_int([1, 2, 3, True, 'hello', 4, 'abcdef', 1.1])
[1, 2, 3, 4]
List กับ String
String เปลี่ยนแปลงค่าไม่ได้ แต่ List เปลี่ยนแปลงค่าได้ ทั้ง String และ
List
เป็นการเรียงลำดับและเปลี่ยนแปลงค่ากลับกันไปมาได้ด้วยการใช้ฟังก์ชันของลิสต์
เช่น split()
, join()
ดังตัวอย่างต่อไปนี้
>>> s = 'Mink is a cat.'
>>> s
'Mink is a cat.'
>>> t = s.split()
>>> t ['Mink', 'is', 'a', 'cat.']
>>> ' '.join(t)
'Mink is a cat.'
>>> p = '081-123-4567'
>>> p
'081-123-4567'
>>> t = p.split('-')
>>> t ['081', '123', '4567']
>>> '-'.join(t)
'081-123-4567'
Objects กับ values
ภาษาไพทอนเพื่อประหยัดพื้นที่ในหน่วยความจำ สำหรับ String ซึ่งไม่สามารถเปลี่ยนแปลงค่าได้ หรือ Immutable Data Structure ภาษา Python จะชี้ชื่อตัวแปรไปที่ที่เดียวกันสำหรับค่าที่เหมือนกัน ดังตัวอย่างต่อไปนี้
>>> a = 'banana'
>>> b = 'banana'
>>> id(a)
67486272
>>> id(b)
67486272
>>> a is b
True
แต่สำหรับลิสต์ซึ่งเปลี่ยนแปลงค่าได้ หรือ Mutable Data Structure ภาษา Python จะเก็บไว้คนละที่ในหน่วยความจำ แต่สามารถสร้างชื่อตัวแปรต่อๆ กันมาได้ สำหรับตำแหน่งหนึ่งๆ เรียกว่า การทำ Aliasing
Objects อยู่ในหน่วยความจำมี Values แต่ไม่มีชื่อ แต่มี id หรือหมายเลขกำกับ สร้างตัวแปรเพื่อชี้ไปยัง Objects เหล่านั้น ตั้งตัวแปรหลายตัวหรือตัวเดียวก็ได้ ดังตัวอย่างต่อไปนี้
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a is b
False
>>> id(a)
67462368
>>> id(b)
67464088
>>> c = a
>>> id(c)
67462368
>>> c is a
True
แบบฝึกหัด
กำหนดคะแนนของนักเรียน 5 คน เก็บไว้ใน list คือ 75 80 68 82 62 ต้องการหาคะแนนรวม คะแนนเฉลี่ย คะแนนมากสุด คะแนนน้อยสุด
ให้ข้อมูลเป็น list มีค่าคือ 3 4 12 31 ให้หาจำนวนสมาชิกใน list และพิมพ์สมาชิกทุกตัวตัวละบรรทัด
ให้ข้อมูลเป็น list มีค่าคือ 25 4 3 15 21 นำมาเรียงจากน้อยไปหามาก พร้อมหาผลคูณของสมาชิกทุกตัว
ให้ข้อมูลเป็น list มีค่าคือ 6 9 8 7 10 ให้ลบข้อมูลตัวแรกทิ้งแล้วเพิ่มข้อมูลตัวแรกไปที่ตำแหน่งสุดท้าย
จงสร้างข้อมูลเป็น list ชื่อ a มีค่าคือ 1-10 และ list ชื่อ b มีค่าคือ 11-20 โดยใช้ for และใช้ฟังก์ชัน append เพื่อเพิ่มสมาชิกใน list แล้วหาค่า a+b