Python List Methods ที่ใช้บ่อยๆ

Grassroot Engineer
7 min readAug 4, 2022

--

Back to the basic

อีกครั้ง สำหรับเรื่อง List (แต่จะลอง compare ระหว่างตัวภาษาระหว่าง Python กับ Dart เพื่อดูว่าใช้เหมือนกันไหม โดยยึด Python เป็นหลัก)

ส่วนเรื่องของ Python dict methods ผมเคยเขียนไว้แล้ว ที่นี่ ลองชมกันได้คับ แต่ถ้าเรื่อง List มาดูกันเลย เพราะได้ใช้บ่อยแน่ๆ

  1. append()
  2. extend()
  3. index()
  4. insert()
  5. remove()
  6. count()
  7. pop()
  8. reverse()
  9. sort()
  10. copy()
  11. 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' ใส่เข้าไปที่ตำแหน่ง -1
print('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() ให้ใช้เหมือนกัน

remove() in Dart.

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

ใช้ where() เข้าช่วยเช็คว่ามีจำนวนเท่าไหร่ จะได้ 6 เหมือนกันนะ (นับค่า 2 นั่นเอง)

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)
remove() ของ Dartใช้แทน pop() ของ Python

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 ได้เช่นกัน

reversed ใน Dart

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()

ใช้ sorted() ต้องมีตัวแปรไปรับค่าด้วย เพราะ return List กลับมา

ขอย้อนกลับไปนิดนึงนะ ก่อนหน้ายังมี params อีกตัวที่ชื่อ key ที่เราสามารถสร้าง function เพื่อกำหนดรูปแบบการ sort ได้ มาลองทดสอบกันดูนะ

Sort the list using key
เขียน lambda เข้าไปใน key จะง่ายกว่านะ (ไม่เยิ่นเยื้อ)

จากตัวอย่างด้านบนจะเห็นว่า 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 ปกติม้นจะพังนะ)

ต้องใช้ tuple มาเปรียบเทียบก่อน ให้ได้ format การ sort
True=1, False=0 เปรียบเทียบให้เห็นภาพ

อีกกรณีนึงที่จะทำให้เข้าใจหลักการใช้ key เข้ามาช่วยในการ sort เช่น การ sort ปกติ จะเรียงแบบ ASC หรือ DESC แต่ถ้าเราต้องการ sort ให้เป็นรูปแบบที่เรากำหนดเอง เช่น การ sort วันในสัปดาห์ เราสามารถมากำหนดได้แบบนี้เลยครับ

  • เคสแบบนี้เราจะ sort แบบปกติแบบ ASC ไม่ได้ จะเรียงวันไม่ถูกต้อง
  • จึงต้องใช้การสร้าง template_list ขึ้นมาก่อน แล้วค่อย refer key มาที่ index
ตัวอย่างการ sort days ด้วย index ให้เป็นแบบที่เราต้องการ

หรือ กรณีที่เป็น dict เราก็จะ sort ด้วย template ได้เช่นกัน

การ sort ด้วย key ใน dict

ก่อนไป method ถัดไป ลองดูภาษา dart กันบ้างนะคับ ก็มี sort() เหมือนกันแต่จะไม่มี reverse params ให้ใช้นะ (อันนี้แค่ลองเปรียบเทียบกันเล่นๆครับ)

sort() in Dart ก็มีนะตัวเทอ

ฉะนั้นถ้าเราต้องการ sort แบบอื่นที่ไม่ใช่ ASC จะต้องใช้ compare function ที่มีใน sort() มา apply นะ

sort by DSC (มากไปน้อย)

แต่ถึงกระนั้น อันนี้ตัวอย่างของการ sort ด้วย length ตาม example เลย

sort by length (ด้วย compare function)

เพิ่มเติมนิดนึงคับ เราสามารถ 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 ที่ผิดพลาด

used case เมื่อใช้ .copy() เพื่อให้ได้ list ชุดใหม่

วิธีการ copy List ทำได้หลายแบบตามนี้เลย

การ copy list ทั้ง 3 แบบนะใน Python

ส่วนการ copy หรือ clone List ในภาษา Dart (มีหลายวิธีเท่ๆเช่นกัน)

copy list ทั้ง 3 แบบใน Dart

11. clear()

เป็นการ remove all elements ออกไปจาก list เลย สิ่งที่ได้จะเหลือแค่ Empty list เท่านั้น

การ clear list ทั้ง 3 แบบ in Python

ส่วนใน Dart ถ้าเราต้องการ clear ก็ทำได้หลายแบบเช่นกัน

clear list in Dart

If you think it’s useful for you, just clap your hands 👏 to be encouraged me.

GRASSROOT ENGINEER 😘

--

--