Python List Methods ที่ใช้บ่อยๆ
Back to the basic
อีกครั้ง สำหรับเรื่อง List (แต่จะลอง compare ระหว่างตัวภาษาระหว่าง Python กับ Dart เพื่อดูว่าใช้เหมือนกันไหม โดยยึด Python เป็นหลัก)
ส่วนเรื่องของ Python dict methods
ผมเคยเขียนไว้แล้ว ที่นี่ ลองชมกันได้คับ แต่ถ้าเรื่อง List มาดูกันเลย เพราะได้ใช้บ่อยแน่ๆ
- append()
- extend()
- index()
- insert()
- remove()
- count()
- pop()
- reverse()
- sort()
- copy()
- clear()
มาเจาะทีละตัวกันเลยดีกว่าคับ ไม่ยากๆ
เริ่มด้วย append()
vs extend()
จำง่ายๆคือ
append()
method is used to add a single element to the end of a list.extend()
method is used to add multiple elements to the end of a list
ไปดูตัวอย่างข้างล่างเลยคับ
1. append()
อันนี้ใช่บ่อยเลยเป็นการใส่ข้อมูลเข้าไปใน list นะ โดยข้อมูลที่ใส่เข้าไปจะไปอยู่ตำแหน่งหลังสุด หรือ index ที่ -1 นั่นเอง
- ถ้าเป็นภาษา dart จะใช้คำว่า add()
แทนนะ
currencies = ['Dollar', 'Euro', 'Pound']
currencies.append('Baht') # มันจะเพิ่มค่าใน list ทีละตัวนะprint(currencies)# output
# ['Dollar', 'Euro', 'Pound', 'Baht']
2. extend()
อันนี้เป็นการ add all elements ของ iterable เข้าด้วยกัน (iterable = list, tuple, string etc) โดยจะเติมลงไปที่ท้ายสุดของ list นะ
extend()
จะใช้กับการเอา list มาต่อกัน ในภาษา dart จะใช้คำว่า addAll()
ตัวอย่างด้านล่างเป็นการเปรียบเทียบ append() vs extend()
เพื่อให้เห็นความต่าง
prime_numbers = [2, 3, 5]
numbers = [1, 4]prime_numbers.append(numbers) # แบบนี้จะเป็นการเพิ่มค่าเป็นชุดเลย
print(prime_numbers)# output
# [2, 3, 5, [1, 4]]
แต่ถ้าเป็น extend() มันจะทำการ flat=True
ให้เลย คือ จะไม่มีการซ้อน list
เหมือนกับ append()
นะ
prime_numbers = [2, 3, 5]
numbers = [1, 4]prime_numbers.extend(numbers)
print(prime_numbers)# output
# [2, 3, 5, 1, 4]
และถึงแม้จะเป็นคนละ type กัน ก้อยังสามารถใช้ extend() ได้นะ
my_list = [1, 2, 3]
my_tuple = (4, 5, 6)
my_list.extend(my_tuple)
print(my_list) # Output: [1, 2, 3, 4, 5, 6]
3. index()
Method นี้เป็นการหา index จาก element โดยจะ return กลับมาเป็น int นะ
ถ้าหาไม่เจอใน element ทั้งหมดจะด่ากลับมาว่า ValueError
โดยคำสั่งนี้ในภาษา dart จะใช้คำว่า indexOf()
ในภาษา dart ถ้าหาไม่เจอจะ return -1
กลับมา ต่างกันนิดนึงนะ
animals = ['cat', 'dog', 'rabbit', 'horse']
index = animals.index('horse') # มีการ return กลับมาเป็น int ด้วยนะprint(index)
print(animals.index('rabbit')) # จึง print แบบนี้ได้เลย# output
# 3 เป็น index ของ horse นะ
# 2 เป็น index ของ rabbit นะ
4. insert()
Method เป็นการแทรก element
เข้าไปในตำแหน่ง หรือ index
ที่เรากำหนดได้เลย
จากในรูปด้านล่างจะ จะเป็นการแทรก ตัว o
เข้าไปใน index ที่ 3
ของ list vowel
ถ้าไม่ใช้ insert
ไปใช้ append
ปกติ ค่าที่เข้าไปจะอยู่ด้านขวาสุดนะ
สำหรับคำสั่งนี้ ใน dart
ก็มีเช่นเดียวกัน โดยมี syntax
เหมือนกันเลยคือ
list_name.insert(int index, E element)
ส่วน Python ก็แบบนี้เลย
vowel = ['a', 'e', 'i', 'u']
vowel.insert(3, 'o')print('List:', vowel)# output
# List: ['a', 'e', 'i', 'o', 'u'] พอแทรกเข้ามาแล้ว จึงได้ผลลัพธ์แบบนี้
อีกตัวอย่างของการ insert ด้วย index เข้าไปนะ
ถ้าเราใส่ index = -1
เข้าไปแบบนี้ จากโค้ดด้านล่างนะ
- ตำแหน่ง
-1
คือตำแหน่งที่u
อยู่นั่นเองถ้านับจากด้านหลัง - ถ้านับจากด้านหน้า ตำแหน่งที่
u
อยุ่คือindex ที่ 3
- ฉะนั้นเมื่อ
insert -1
เข้าไปแล้ว จึงทำให้o
เข้าไปอยู่ในindex ที่ 3
นั่นเอง
(ไม่งงนะ)
vowel = ['a', 'e', 'i', 'u']
vowel.insert(-1, 'o') # เอา 'o' ใส่เข้าไปที่ตำแหน่ง -1print('List:', vowel)# output
# List: ['a', 'e', 'i', 'o', 'u']
5. remove()
method
นี้ก็ตามชื่อเลย ต้องการจะลบ element
ไหนออกไป ก็ระบุเข้ามาได้เลยแบบนี้ แต่ถ้ามี element
ที่ต้องการลบหลายตัวใน list
, มันจะลบออกแค่ตัวหน้าสุดตัวเดียว
prime_numbers = [2, 3, 5, 7, 9, 11]prime_numbers.remove(9) ถ้ามี 9 หลายตัว จะถูกลบออกแค่ตัวหน้าสุดตัวเดียวเท่านั้นprint(prime_numbers)# output
# [2, 3, 5, 7, 11] เห็นไหม หลังจาก remove 9 ออกไปจะไม่มีแล้ว
แต่ถ้าเป็นใน dart
จะละเอียดหน่อยนะ คือ มีตัวเลือก remove
ให้เพียบเลย โดยระบุเงื่อนไขในการ remove
ได้ด้วย สรุปคือ มี remove()
ให้ใช้เหมือนกัน
6. count()
Method
นี้จะ return
จำนวนของครั้งที่ element
นั้นๆมีใน list นะ งงไหม…
เพราะว่า list
สามารถมี element
ซ้ำๆได้ไง บางครั้งเราต้องการนับว่ามีจำนวนเท่าไหร่ใน list
ก็สามารถใช้ count()
ได้เลยแบบนี้
prime_numbers = [2, 2, 2, 7, 2, 2, 2, 5, 7, 9, 'love', 'love']
count_two = prime_numbers.count(2)
count_love = prime_numbers.count('love')print(count_two)
print(count_love)# output
# 6 เพราะมี 2 ใน list อยู่ 6 ตัวนะ
# 2 เพราะมีคำว่า love ใน list อยู่ 2 ตัวนะ
ส่วนใน dart
ไม่มี method
นี้นะ จำต้องพลิกแพลงนิดหน่อย ตัวอย่างของการหา count
ด้วยภาษา dart
7. pop()
pop()
เป็นการเอา remove
ค่าออกนะ โดยเราสามารถระบุ index ที่เราต้องการนำค่าออกไปได้เลย หรือ ถ้าเราไม่ระบุ index
ข้างใน จะเป็นการเอาค่าสุดท้าย (last) หรือ -1
โดย default
นะ
อ่อ ในการ pop
จะ return
ค่าออกมาด้วยนะเป็นค่าที่เรา pop
ออกมา เราจึงเอาตัวแปรไปรับได้เลย และค่าใน list
ก็จะหายไป เพราะ pop
เป็นการหยิบออกไปเลย
prime_numbers = [2, 3, 5, 7]removed_element = prime_numbers.pop(2) # เป็นการเอา index ที่ 2 ออกไปprint('Removed Element:', removed_element)
print('Updated List:', prime_numbers)# output:
# Removed Element: 5
# Updated List: [2, 3, 7] # เหลือแค่นี้ไม่มี 5 เพราะถูก pop ออกไปแล้ว
ในกรณีที่ไม่ระบุ index
ภายใน pop
นะ
prime_numbers = [2, 3, 5, 7]removed_element = prime_numbers.pop() # ไม่ระบุ index ภายในprint('Removed Element:', removed_element)
print('Updated List:', prime_numbers)# output
# Removed Element: 7 # จะเอา element ที่ -1 ออกไป ถ้าไม่ระบุ index
# Updated List: [2, 3, 5]
สำหรับใน Dart
จะไม่มี pop()
นะคับ แต่เราสามารถใช้ remove()
ได้เหมือนเดิม ถ้าเปรียบเทียบก็จะเป็นแบบนี้
pop() = removeLast()
pop(index) = removeAt(index)
8. reverse()
method นี้ตรงๆตัวเลย คือ เป็นการ reverse ค่าใน list นั่นแหละ สลับหน้า-หลัง ไม่มีอะไรซับซ้อน
ไม่ต้องการ
argument
+ ไม่มีreturn
นะ ค่าที่ได้หลังจากเรียก method จะแทนค่าเดิมเลย
prime_numbers = [2, 3, 5, 7]
prime_numbers.reverse() # ไม่ต้องการ argument นะprint(prime_numbers)# output
# [7, 5, 3, 2] # เห็นไหมสลับกันแล้ว 7 มาอยุ่หน้า, 2 ไปอยู่หลัง
ใน dart ก็มีให้ใช้เหมือนกันนะ เป็น getter โดยเราต้องมีตัวแปรมารับค่าใหม่ด้วยแบบนี้เลย reverse ได้เช่นกัน
9. sort()
เป็นการจัดเรียง elements
ของ list
แบบ ASC นะ (คือจากน้อยไปมาก ascending order
) โดยไม่มีการ return อะไรกลับมา => หลังจากจัดเรียงแล้วจะไปทับกับ original list
เลย
มี
2 optional params
ให้ใช้ด้วยคือ
- reverse — If
True
, the sorted list is reversed (or sorted in Descending order) - key — function that serves as a key for the sort comparison
มาดูตัวอย่างการใช้ดีกว่า
prime_numbers = [11, 3, 7, 5, 2]
prime_numbers.sort() # ไม่ได้ระบุ params อะไรเข้าไปprint(prime_numbers)# output
# [2, 3, 5, 7, 11] # จะจัดเรียงจากน้อยไปมากนะ ASC
แต่ถ้าเราระบุ reverse=True จะทำให้แปลงเป็น DSC (Descending order) แบบนี้
prime_numbers = [11, 3, 7, 5, 2]
prime_numbers.sort(reverse=True) # reverse=True จะเรียงจากมากไปน้อยprint(prime_numbers)# output
# [11, 7, 5, 3, 2] # เห็นไหม 11 มาอยู่หน้า และ 2 มาอยู่หลัง
แทรกนิดนึงนะ เพราะมีความคล้ายคลึงกับ sorted()
ที่เป็น built-in function ของ Python โดยเราสามารถใช้การ sort ด้วยวิธีนี้ได้เช่นกัน และมี params ให้ใช้เหมือนกันด้วย
เพียงแต่ sorted()
จะมีการ return List
กลับมาจึงต้องมีตัวแปรไปรับนั่นเอง เพราะไม่ได้ sort
ในตัว original list
เหมือนกับ sort()
ขอย้อนกลับไปนิดนึงนะ ก่อนหน้ายังมี params
อีกตัวที่ชื่อ key
ที่เราสามารถสร้าง function เพื่อกำหนดรูปแบบการ sort ได้ มาลองทดสอบกันดูนะ
จากตัวอย่างด้านบนจะเห็นว่า sort
ด้วย key age
แค่อันเดียวเท่านั้น ถ้าเราต้องการ sort
ด้วย 2 keys
สามารถเขียนเพิ่มใน lambda
ได้แบบนี้นะคับ
จากในโค้ดคือ sort
ด้วย age
และ Name
โดยเรียงจากซ้ายไปขวานั่นเอง
employees.sort(key=lambda x: (x.get('age'), x.get('Name')))
อีกกรณีนะคับ แล้วถ้าใน list
เรามี None
ด้วยล่ะ เราต้องใช้วิธีการ sort แบบนี้
(ถ้า sort ปกติม้นจะพังนะ)
อีกกรณีนึงที่จะทำให้เข้าใจหลักการใช้ key
เข้ามาช่วยในการ sort เช่น การ sort ปกติ จะเรียงแบบ ASC
หรือ DESC
แต่ถ้าเราต้องการ sort ให้เป็นรูปแบบที่เรากำหนดเอง เช่น การ sort วันในสัปดาห์ เราสามารถมากำหนดได้แบบนี้เลยครับ
- เคสแบบนี้เราจะ
sort
แบบปกติแบบASC
ไม่ได้ จะเรียงวันไม่ถูกต้อง - จึงต้องใช้การสร้าง
template_list
ขึ้นมาก่อน แล้วค่อย referkey
มาที่index
หรือ กรณีที่เป็น dict เราก็จะ sort ด้วย template ได้เช่นกัน
ก่อนไป method ถัดไป ลองดูภาษา dart กันบ้างนะคับ ก็มี sort()
เหมือนกันแต่จะไม่มี reverse
params ให้ใช้นะ (อันนี้แค่ลองเปรียบเทียบกันเล่นๆครับ)
ฉะนั้นถ้าเราต้องการ sort
แบบอื่นที่ไม่ใช่ ASC จะต้องใช้ compare function
ที่มีใน sort()
มา apply นะ
แต่ถึงกระนั้น อันนี้ตัวอย่างของการ sort
ด้วย length
ตาม example
เลย
เพิ่มเติมนิดนึงคับ เราสามารถ sort dict
ได้ด้วยนะ เท่ๆเลย แต่ต้องแปลงให้เป็น tuple ก่อนด้วย .items()
- จะเห็นว่า output มีการ sort เรียบร้อยแล้ว ด้วยการ sort ที่ key นะ
- จากเดิม
brand, model, color, year
จะเปลี่ยนใหม่เป็นbrand, color, model, year
นั่นเอง
car = {
'brand': 'Honda',
'model': 'city',
'color': 'black',
'year': 2012
}
def sort_by_key(item):
return item[0]
result_sorted = sorted(car.items(), key=sort_by_key) # sorted(car.items(), key=lambda x: x[0])
print(result_sorted)
print(dict(result_sorted)) # แปลงกลับเป็น dict ได้ง่ายๆเลย
# output
# [('brand', 'Honda'), ('color', 'black'), ('model', 'city'), ('year', 2012)]
# {'brand': 'Honda', 'color': 'black', 'model': 'city', 'year': 2012}
10. copy()
method นี้ก็ตรงๆตัวเลยนะ ทำการ copy List
ให้เราใหม่อีกชุดนึง โดยต้องมีตัวแปรมารับ List
ชุดใหม่ด้วย (เพราะมีการ return)
การใช้งานไม่ต้องการ params เลย
จริงๆแล้ว การใช้ copy() แบบนี้เราจะเรียกว่า copy list without reference เพื่อไม่ให้ส่งผลกับค่าเดิมหรือ constant ตัวเดิม ซึ่งอาจส่งผมให้ program เราให้ output ที่ผิดพลาด
วิธีการ copy List ทำได้หลายแบบตามนี้เลย
ส่วนการ copy หรือ clone List ในภาษา Dart (มีหลายวิธีเท่ๆเช่นกัน)
11. clear()
เป็นการ remove all elements
ออกไปจาก list
เลย สิ่งที่ได้จะเหลือแค่ Empty list
เท่านั้น
ส่วนใน Dart ถ้าเราต้องการ clear ก็ทำได้หลายแบบเช่นกัน
If you think it’s useful for you, just clap your hands 👏 to be encouraged me.
GRASSROOT ENGINEER 😘