การทำงานกับ List ใน Python
List vs Array
ในการเขียน python เราจะใช้ list แทนที่ array ซึ่งจะต่างกันตรงที่
-
list คือ กลุ่มของ object(collection of object) ซึ่งใน python ทุกๆ data type จะเป็น object ทั้งหมด ดังนั้น สมาชิกใน list สามารถเป็น data type อะไรก็ได้
objects = ['hello', 1, 2, 3, 'test']
-
array คือ กลุ่มของตัวแปรที่มี data type เดียวกัน ตัวอย่างการใช้งาน array ใน numpy
import numpy as np numbers = np.array([1, 2, 3, 4, 5], dtype=np.int64)
ถ้าต้องการใช้ Array เราจะต้องติดตั้ง numpy package ก่อน
ลองดูวิธีการใช้งาน Array ใน Python ได้ในบทความนี้
วิธีการสร้าง List
-
กำหนดค่า list เข้าไปเลย
numbers = [1, 2, 3, 4]
-
สร้าง list ว่างๆ ขึ้นมา
emptyList = [] # หรือ emptyList = list()
-
ใช้ comprehension list
words= "This is a python list comprehension".split() lengths = [len(word) for word in words]
ซึ่งจะมีค่าเทียบเท่ากับการใช้ for loop แบบนี้
lengths = [] for word in words: lengths.append(len(word))
เราสามารถใช้ range เข้ามาช่วย comprehension list แบบนี้ก็ได้่
numbers = [x ** 2 for x in range(1, 11)] print(numbers) # ผลลัพธ์จะออกมาเป็น list ของเลขยกกำลัง 2 ตั้งแต่ 1-10 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
นอกจากนี้เรายังสามารถเลือกเฉพาะสมาชิกบางตัวมาใช้สร้าง list ใหม่ได้ด้วย if แบบนี้
# เลือกเฉพาะสมาชิกใน range(1, 11) ที่หาร 2 ลงตัว(เลขคู่) numbers = [x ** 2 for x in range(1, 11) if x % 2 == 0] print(numbers) # ผลลัพธ์จะออกมาแบบนี้ [4, 16, 36, 64, 100]
การใช้ For loop ในการเข้าถึงสมาชิกแต่ละตัว
การวน loop สมาชิกแต่ละตัวของ list เราจะใช้ loop แบบนี้
numbers = [ 1, 2, 3, 4, 5, 6]
for number in numbers
print(number)
พื้นฐานการทำงานกับ list ที่คุณต้องรู้จัก
เริ่มต้นจากการประกาศตัวแปร countries ขึ้นมาก่อน
countries = ['Thailand', 'Laos', 'Singapore']
การเข้าถึงสมาชิกแต่ละตัว
เราจะเข้าถึง สมาชิกของ list ด้วย index ที่เริ่มต้นด้วย 0
print(countries[0])
# ผลลัพธ์จะออกมาเป็น Thailand(สมาชิกตัวแรก)
นอกจากนี้เรายังสามารถนับย้อนกลับจากด้านหลังได้ด้วย โดยที่สมาชิกตัวท้ายสุดจะเป็น -1 และไล่ย้อนกลับมาเรื่อยๆ
print(countries[-1])
# ผลลัพธ์จะออกมาเป็น Singapore(สมาชิกตัวแรก)
print(countries[-3])
# ผลลัพธ์จะออกมาเป็น Thailand(นับย้อนกลับมาจากข้างหลัง 3 ตัว)
การใช้ operator in และ not in
การตรวจสอบว่าใน list นั้นมีค่าที่ต้องการอยู่หรือไม่ให้ไช้
"Thailand" in countries
# ผลลัพธ์จะออกมาเป็น True เพราะ Thailand อยู่ใน list
"Qatar" in countries
# ผลลัพธ์จะออกมาเป็น False เพราะ Qatar ไม่ได้อยู่ใน list
"Qatar" not in countries
# ผลลัพธ์จะออกมาเป็น True เพราะ Qatar ไม่ได้อยู่ใน list
การค้นหาสมาชิกภายใน list
เราสามารถใช้ method index เพื่อค้นหาว่าใน list นั้นมีค่าที่เราต้องการอยู่ใน index ไหน
position = countries.index('Thailand')
# ค่าของ position จะเป็น 0 เพราะ Thailand เป็นสมาชิกตัวแรกของ list countries
แต่ถ้าค้นหาแล้วพบว่าค่าที่ต้องการไม่ได้อยู่ใน list python จะ throw error ออกมาแบบนี้
position = countries.index('xxx')
เมื่อเรา run บรรทัดนี้ก็จะเกิด ValueError ออกมาแบบนี้
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'xxx' is not in list
การเพิ่มสมาชิกเข้าไปใน list
การเพิ่มสมาชิกใหม่เข้าไปใน list เราจะทำได้ 2 วิธีคือ
- ใช้ append method เพื่อเพิ่มสมาชิกใหม่เข้าไปต่อท้าย list เดิม แบบนี้
countries.append('Malaysia') print(countries) # ผลลัพธ์จะออกมาเป็นแบบนี้ ['Thailand', 'Lao', 'Singapore', 'Malaysia']
- ใช้ insert method ในกรณีที่คุณต้องการระบุว่าจะให้สมาชิกใหม่เข้าไปวางในตำแหน่งไหน
# นำสมาชิกใหม่เข้าไปวางไว้ในตำแหน่งแรก index=0 countries.insert(0, 'Myanmar') print(countries) # ผลลัพธ์จะออกมาเป็นแบบนี้ ['Myanmar', 'Thailand', 'Lao', 'Singapore', 'Malaysia']
นอกจาก method append และ insert แล้วเรายังสามารถนำ list มาต่อกันได้ด้วย operation += และ extend method แบบนี้ก็ได้
a = [1, 2, 3]
b = [4, 5, 6]
# ถ้าต้องการ print ออกมาเฉยๆไม่ได้ต้องการกำหนดค่าให้กับตัวแปรใดให้ใช้
print(a + b)
# ถ้าต้องการนำทั้ง 2 list ไปรวมไว้ในตัวแปร a ให้ใช้
a += b
print(a)
หรือ ถ้าคุณต้องการใช้ extend เพื่อให้อ่านง่ายมากขึ้น เราจะเขียนแบบนี้
a = [1, 2, 3, 4]
a.extend([5, 6, 7])
# ผลลัพธ์จะออกมาเป็น
[1, 2, 3, 4, 5, 6, 7]
การลบสมาชิกออกจาก list
การลบสมาชิกออกจาก list ก็สามารถทำได้ 2 วิธีเช่นเดียวกัน
- ใช้ remove method สำหรับการระบุ value ของสมาชิกที่ต้องการลบ
# ลบ "Laos" ออกจาก countries countries.remove('Laos') print(countries) # ผลลัพธ์จะออกมาเป็น ['Thailand', 'Singapore']
- ใช้ del สำหรับการระบุตำแหน่งของสมาชิกที่ต้องการลบ(ไม่สนใจ value ของสมาชิกตัวนั้น)
# ลบสมาชิกตัวแรกออกจาก list del countries[0] print(countries) # ผลลัพธ์จะออกมาเป็น ['Laos', 'Singapore']
เลือกสมาชิกบางส่วน(Slice)
เราสามารถเลือกสมาชิกบางส่วนของ list ออกมาได้ด้วยการกำหนดค่าของตำแหน่งเริ่มต้นและสิ้นสุดได้ในรูปแบบนี้
python_list[start:stop:]
- start ตำแหน่งของ สามาชิกที่ต้องการดึงออกมาเป็นตัวแรก(start)
- stop ตำแหน่งสุดท้าย ซึ่งผลลัพธืจะไม่รวมสมาชิกในตำแหน่งนี้(exclude)
- stride เราสามารถกำหนด stride เป็น 2 เพื่อนำสมาชิกออกมา ตัว เว้น ตัว หรือจะใส่เป็น -1 เพื่ิอ reverse ผลลัพธ์(กลับจากหลังมาหน้า)ได้
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[5::])
# ผลลัพธ์จะออกมาเป็น [6, 7, 8, 9, 10]
# ตั้งแต่ index = 5 เป็นต้นไป
print(numbers[2, 5])
# ผลลัพธ์จะออกมาเป็น [3, 4, 5]
print(numbers[::2])
# ผลลัพธ์จะออกมาเป็น [1, 3, 5, 7, 9]
print(numbers[1::2])
# ผลลัพธ์จะออกมาเป็น [2, 4, 6, 8, 10]
# เริ่มต้นที้ 2 เพราะ index = 1
print(numbers[::-1])
# ผลลัพธ์จะออกมาเป็น [10, 9, 8, 7, 6 , 5, 4, 3, 2, 1]
เรียงลำดับสมาชิกภายใน list
เราสามารถจัดเรียงสมาชิกภายใน list ด้วย
print(countries[::-1])
แต่การจัดเรียงแบบนี้จะ__เป็นแค่การแสดงผลเท่านั้น__ แต่ถ้าเราต้องการที่จะจัดเรียงผลลัพธ์ใน list นั้นใหม่(ตัวแปรนั้นจะเปลี่ยนลำดับของสมาชิก) ให้ใช้
- reverse method เพื่อสลับจากข้างหลังมาข้างหน้า แบบนี้
print countries
# ['Thailand', 'Laos', 'Singapore']
countries.reverse()
print(countries)
['Singapore', 'Laos', 'Thailand']
- sort method เพื่อจัดเรียงตามตัวอักษร(string) หรือ น้อยไปมาก(int) เป็นการจัดเรียงแบบ assending
# จาก ['Thailand', 'Laos', 'Singapore']
countries.sort()
# หลังจาก sort แล้วจะเป็น ['Lao', 'Singapore', 'Thailand']
# ถ้าต้องการเรียงจากมากไปน้อย(desending) ให้ใช้ reverse=True
countries.sort(reverse=True)
# หลังจาก sort แล้วจะเป็น ['Thailand', 'Singapore', 'Lao']
# ถ้าต้องการเรียง โดยระบุ function เราสามารถกำหนด key เข้าไปได้แบบนี้
# ตัวอย่างนี้ใช้ len() ในการจัดเรียง ผลลัพธ์จจะเรียงจากตัวอักษรที่สั้นที่สุด ไปยาวที่สุด
countries.sort(key=len)
# หลังจาก sort แล้วจะเป็น ['Lao', 'Thailand', 'Singapore']
# เราสามารถกลับเรียงจากตัวอักษรที่ยาวที่สุด ไปหาคำที่สั้นที่สุด ได้แบบนี้
countries.sort(key=len, reverse=True)
# หลังจาก sort แล้วจะเป็น ['Singapore', 'Thailand', 'Lao']
Customize sorting algorithm
เราสามารถเขียนวิธีการเรียงลำดับของเราเองได้ด้วย การนิยาม function ขึ้นมาแบบนี้
def sortSecondChar(e):
return e[1]
countries.sort(key=sortSecondChar)
# ผลลัพธ์จะออกมาเป็น
['Lao', 'Thailand', 'Singapore']
ซึ่งจะเรียงตามตัวอักษรตัวที่ 2 a, h และ i
ในตัวอย่างนี้ เราจะระบุให้ return สมาชิกตัวที่ 2(index=1) ออกมาเพืื่อนำไปจัดเรียง
สิ่งที่ return ออกมาจะเป็นสิ่งที่นำไปจัดเรียง