Python ตอนที่ 73 การเรียงข้อมูลใน List

ข้อมูลประเภท List มีเมธอด sort() ซึ่งใช้เรียงข้อมูลตามตัวอักษรและตัวเลขจากน้อยไปหามากเป็นค่าเริ่มต้น

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo", "Sony"]
phone.sort()
print(phone)

ผลลัพธ์

[‘Asus’, ‘Nokia’, ‘Oppo’, ‘Samsung’, ‘Sony’, ‘Vivo’, ‘Wiko’, ‘iPhone’]

number = [10, 50, 20, 15, 2, 6]
number.sort()
print(number)

[2, 6, 10, 15, 20, 50]

ถ้าต้องการเรียงข้อมูลจากมากไปน้อย ก็สามารถทำได้โดยการใช้คีย์เวิร์ด reverse = True โดยมีรูปแบบดังนี้

list.sort(reverse = True)
phone = ["Apple", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo", "Sony"]
phone.sort(reverse=True)
print(phone)

[‘Wiko’, ‘Vivo’, ‘Sony’, ‘Samsung’, ‘Oppo’, ‘Nokia’, ‘Asus’, ‘Apple’]

number = [10, 50, 20, 15, 2, 6]
number.sort(reverse=True)
print(number)

[50, 20, 15, 10, 6, 2]

Case Insensitive Sort

โดยปกติเมธอด sort() จะทำงานแบบ case sensitive คือพิจารณาตัวอักษรพิมพ์เล็กพิมพ์ใหญ่ด้วย โดยเวลาเรียงข้อมูล จะเรียงตัวอักษรพิมพ์ใหญ่ก่อน ตามด้วยตัวอักษรพิมพ์เล็ก ดังตัวอย่าง

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo", "Sony"]
phone.sort()
print(phone)

ผลลัพธ์

[‘Asus’, ‘Nokia’, ‘Oppo’, ‘Samsung’, ‘Sony’, ‘Vivo’, ‘Wiko’, ‘iPhone’]

จะเห็นว่า คำว่า “iPhone” ถูกเรียงไว้หลังสุด เพราะขึ้นต้นด้วยตัวอักษรพิมพ์เล็ก ในขณะที่คำอื่นขึ้นต้นด้วยตัวอักษรพิมพ์ใหญ่ทั้งหมด

จากตัวอย่าง อาจทำให้ผลลัพธ์ไม่เป็นไปตามที่ต้องการ เพราะความจริง “iPhone” น่าจะอยู่ลำดับที่ 2 ต่อจาก “Asus” เพราะตัวอักษร “i” มาก่อนตัวอักษร “N”

ถ้าต้องการเรียงข้อมูลในลิสต์แบบ case-insensitive ต้องทำอย่างไร?

ถ้าต้องการเรียงข้อมูลในลิสต์โดยไม่ต้องให้ความสำคัญกับตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่ ก็สามารถทำได้ โดยใช้ built-in function str.lower เป็น key function ในเมธอด sort() โดยมีรูปแบบดังนี้

list.sort(key = str.lower)
phone = ["Apple", "Vivo", "Asus", "iPhone", "Wiko", "Nokia", "Samsung", "Oppo", "Sony"]
phone.sort(key = str.lower)
print(phone)
  • บรรทัดที่ 2 กำหนดคีย์ฟังก์ชัน key = str.lower ให้กับเมธอด sort() เพื่อให้ทำการแปลงตัวอักษร์เป็นตัวพิมพ์เล็กก่อนค่อยจัดเรียง ก็เท่ากับว่าข้อมูลที่เอามาเรียนเป็นตัวพิมพ์เล็กทั้งหมด ทำให้การเรียงไม่ผิดพลาดนั่นเอง

ผลลัพธ์

[‘Apple’, ‘Asus’, ‘iPhone’, ‘Nokia’, ‘Oppo’, ‘Samsung’, ‘Sony’, ‘Vivo’, ‘Wiko’]

การเรียงข้อมูลด้วยฟังก์ชันที่กำหนดเอง

เราสามารถสร้างฟังก์ชันขึ้นมาเพื่อกำหนดแนวทางในการเรียงข้อมูลในลิสต์ แล้วกำหนดฟังก์ชันนั้นเป็นอากิวเมนต์ของเมธอด sort() ในรูปแบบ key = function เพื่อให้ได้การเรียงข้อมูลตามที่เราต้องการ ดังตัวอย่าง

def myFunction(num):
    return abs(num - 10)

mylist = [75, 25, 67, -89, 34]
mylist.sort(key = myFunction)
print(mylist)
  • บรรทัดที่ 1-2 สร้างฟังก์ชันขึ้นมา 1 ฟังก์ชัน คืนค่ากลับออกไปเป็นตัวเลขที่ได้จากการนำเอาตัวเลขที่ส่งเข้ามา ไปลบด้วย 10 แล้วทำให้เป็นจำนวนเต็มบวก
  • บรรทัดที่ 5 เรียกใช้เมธอด sort() เพื่อเรียงข้อมูลในลิสต์ โดยกำหนดอากิวเมนต์เป็นฟังก์ชันที่สร้างไว้ key = myFunction

ผลลัพธ์ที่ได้จะเกิดจากการนำเอาตัวเลขในลิสต์ไปลบ 10 แล้วทำเป็นตัวเลขจำนวนเต็มบวก แล้วจึงนำมาเรียงจากน้อยไปหามาก

[25, 34, 67, 75, -89]

Reverse Order

ถ้าต้องการกลับลำดับข้อมูลในลิสต์โดยมีคำนึงถึงตัวอักษร ให้ใช้เมธอด reverse() ดังนี้

phone = ["Apple", "Vivo", "Asus", "iPhone", "Wiko", "Nokia", "Samsung", "Oppo", "Sony"]
phone.reverse()
print(phone)
  • บรรทัดที่ 2 ใช้เมธอ reverse() กลับลำดับข้อมูลในลิสต์ โดยจะไม่มีการพิจารณาตัวอักษร เพียงกลับลำดับเท่านั้น

ผลลัพธ์

[‘Sony’, ‘Oppo’, ‘Samsung’, ‘Nokia’, ‘Wiko’, ‘iPhone’, ‘Asus’, ‘Vivo’, ‘Apple’]