ลิสต์ (Lists)

ความหมายของลิสต์

ลิสต์ (List) เป็นโครงสร้างข้อมูลที่สำคัญมากของภาษา Python คล้ายคลึงกับ Array ในภาษาอื่นๆ คือ ชุดของข้อมูลที่เรียงลำดับต่อๆ กัน จะเป็นค่าของอะไรก็ได้ การสร้าง list โดยกำหนดสัญลักษณ์ [] เช่น t = [] หรือ ดังตัวอย่างต่อไปนี้

การสร้าง List เปล่า
>>> t = []
>>> t
[]
>>> type(t)
<class 'list'>
>>> id(t)
55105976
>>> t = list()

ตัวอย่างของการกำหนดค่าใน 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] ดังตัวอย่างต่อไปนี้

การแสดงค่า Index ของลิสต์
>>> 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 ก่อนสมาชิกตัวสุดท้ายที่ต้องการตัด ดังตัวอย่างต่อไปนี้

List slicing
>>> 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 สามารถใช้กับลิสต์ได้ ดังตัวอย่างต่อไปนี้

การใช้ 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 ในการเดินทางไปในลิสต์ เป็นดังตัวอย่างต่อไปนี้

การใช้ for loop และตัวดำเนินการ in ในการเดินทางไปในลิสต์
fruits = ['banana', 'orange', 'mango']
for fruit in fruits:
   print(fruit, end=' ')

ซึ่งผลลัพธ์ที่ได้เป็นดังนี้

ผลลัพธ์จากการใช้ for loop และตัวดำเนินการ in ในการเดินทางไปในลิสต์
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)

ถ้าต้องการเอาลิสต์มารวมกันให้ใช้เครื่องหมายบวก (+) ถ้าต้องการขยายลิสต์ให้มีค่าชุดเดิมเพิ่มเป็นกี่เท่าตัวให้ใช้เครื่องหมายดอกจัน (*) เป็นดังตัวอย่างต่อไปนี้

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

ซึ่งผลลัพธ์ที่ได้เป็นดังนี้

ผลลัพธ์จากตัวอย่างการสร้าง map ฟังก์ชัน
>>> 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() ดังตัวอย่างต่อไปนี้

การเปลี่ยนแปลงค่ากลับไปมาระหว่าง list and string
>>> 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

ภาษา Python เพื่อประหยัดพื้นที่ในหน่วยความจำ สำหรับ String ซึ่งไม่สามารถเปลี่ยนแปลงค่าได้ หรือ Immutable Data Structure ภาษา Python จะชี้ชื่อตัวแปรไปที่ที่เดียวกันสำหรับค่าที่เหมือนกัน ดังตัวอย่างต่อไปนี้

Objects and values ของ strings
>>> a = 'banana'
>>> b = 'banana'
>>> id(a)
67486272
>>> id(b)
67486272
>>> a is b
True

แต่สำหรับลิสต์ซึ่งเปลี่ยนแปลงค่าได้ หรือ Mutable Data Structure ภาษา Python จะเก็บไว้คนละที่ในหน่วยความจำ แต่สามารถสร้างชื่อตัวแปรต่อๆ กันมาได้ สำหรับตำแหน่งหนึ่งๆ เรียกว่า การทำ Aliasing

Objects อยู่ในหน่วยความจำมี Values แต่ไม่มีชื่อ แต่มี id หรือหมายเลขกำกับ สร้างตัวแปรเพื่อชี้ไปยัง Objects เหล่านั้น ตั้งตัวแปรหลายตัวหรือตัวเดียวก็ได้ ดังตัวอย่างต่อไปนี้

Objects and Values ของ Lists
>>> 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

แบบฝึกหัด

  1. กำหนดคะแนนของนักเรียน 5 คน เก็บไว้ใน list คือ 75 80 68 82 62 ต้องการหาคะแนนรวม คะแนนเฉลี่ย คะแนนมากสุด คะแนนน้อยสุด

  2. ให้ข้อมูลเป็น list มีค่าคือ 3 4 12 31 ให้หาจำนวนสมาชิกใน list และพิมพ์สมาชิกทุกตัวตัวละบรรทัด

  3. ให้ข้อมูลเป็น list มีค่าคือ 25 4 3 15 21 นำมาเรียงจากน้อยไปหามาก พร้อมหาผลคูณของสมาชิกทุกตัว

  4. ให้ข้อมูลเป็น list มีค่าคือ 6 9 8 7 10 ให้ลบข้อมูลตัวแรกทิ้งแล้วเพิ่มข้อมูลตัวแรกไปที่ตำแหน่งสุดท้าย

  5. จงสร้างข้อมูลเป็น list ชื่อ a มีค่าคือ 1-10 และ list ชื่อ b มีค่าคือ 11-20 โดยใช้ for และใช้ฟังก์ชัน append เพื่อเพิ่มสมาชิกใน list แล้วหาค่า a+b