9 มีนาคม 2558

Published มีนาคม 09, 2558 by with 0 comment

Sort กับภาษา Python

ในภาษา Python เราสามารถทำการ Sort หรือเรียงลำดับข้อมูลได้ด้วยคำสั่ง sorted() บทความนี้ใช้ได้ทั้ง Python 2 และ Python 3 ครับ

เริ่มต้นพื้นฐานการ Sort ข้อมูลในภาษา Python

[python]
>>> a = [3, 2, 5 ,4, 7, 1]
>>> sorted(a)
[1, 2, 3, 4, 5, 7]
[/python]

หากต้องการ Sort จากหลังไปหน้าสามารถทำได้ดังนี้

[python]
>>> a = [3, 2, 5 ,4, 7, 1]
>>> sorted(a, reverse=True)
[7, 5, 4, 3, 2, 1]
[/python]

เรายังสามารถทำการ Sort tuple ได้ด้วย

[python]
>>> t = ('boy', 'apple', 'intel')
>>> sorted(t)
['apple', 'boy', 'intel']
[/python]





คีย์ที่ใช้ในการ Sort
ในภาษา Python จะมีคีย์สำหรับใช้ในการ Sort ข้อมูลด้วย เช่น

  • str.lower บังคับการเรียงลำดับเพื่อรักษาตัวพิมพ์ใหญ่ และตัวพิมพ์เล็กเหมือนกัน

  • len เป็นคีย์ที่เรียงตามความยาวตัวอักษร


ตัวอย่างการใช้งานคีย์ str.lower

[python]
>>> t = ('boy', 'apple', 'intel')
>>> sorted(t, key=str.lower)
['apple', 'boy', 'intel']
[/python]

ตัวอย่างการใช้งานคีย์ len

[python]
>>> t = ('boy', 'apple', 'intel')
>>> sorted(t, key=len)
['boy', 'apple', 'intel']
[/python]

นอกจากนั้น เรายังสามารถกำหนดเงื่อนไขในการ Sort ข้อมูลได้ด้วย ดังตัวอย่าง

[python]
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2]) #เรียงโดยใช้ช่องที่ 3 คือ อายุ
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[/python]

และเรายังสามารถใช้เทคนิคนี้ทำงานกับ objects ได้ดังตัวอย่าง

[python]
>>> student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
>>> class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age

>>> sorted(student_objects, key=lambda student: student.age)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[/python]

อธิบาย

สร้าง class Student ขึ้นมา โดยกำหนดฟังก์ชั่นหลักโดยกำหนดค่าพารามิเตอร์ของฟังก์ชั่น (self, name, grade, age)

  • ให้ตัวแปร name แทนพารามิเตอร์ name

  • ให้ตัวแปร grade แทนพารามิเตอร์ grade

  • ให้ตัวแปร age แทนพารามิเตอร์ age


ต่อมา ทำการ sort ข้อมูลด้วยคำสั่ง sorted ให้ใช้ข้อมูลจาก student_objects แล้วเรียงด้วยคีย์ lambda โดยเงื่อนไขในการเรียงคือ เรียงตามคำสั่งใน class Student ตามลำดับตัวแปร age




Sort ภาษาไทยกับภาษา Python


ภาษา Python รองรับการ Sort ภาษาไทย ด้วยการเรียงตาม utf8 แต่การเรียงนั้นไม่ค่อยเป็นไปตามหลักภาษาไทยเท่าไร ตัวอย่างเช่น

[python]
>>> strs = ['หา', 'นา', 'กา']
>>> sorted(strs)
['กา', 'นา', 'หา']
[/python]

จะเห็นได้ว่า ภาษา Python ยังสามารถเรียงตามตัวอักษรในภาษาไทยได้อย่างถูกต้องอยู่ แต่ถ้ามีสระเพิ่มเข้ามา
ตัวอย่าง

[python]
>>> sorted(['ไก่', 'เป็ด', 'หมู', 'วัว'])
['วัว', 'หมู', 'เป็ด', 'ไก่']
[/python]

จะเห็นได้ว่า ครั้งนี้ Python เรียงผิดหลักภาษาไทย
มีผู้ถามในกลุ่ม 2600 Thailand คำถามเดติดท่าน Narudom Roongsiriwong ครับ ว่าเราจะทำการ Sort ภาษาไทยในภาษา Python อย่างถูกต้องได้อย่างไร

ลิงค์คำถาม https://www.facebook.com/groups/2600Thailand/permalink/411798678980166/
มีท่านหนึ่งเสนอว่า สามารถใช้ PyICU ในการ Sort ภาษาไทยกับภาษา Python ได้
PyICU เป็น api สำหรับใช้เชื่อมต่อเข้ากับ ICU C++ API ของ IBM ทำงานเกี่ยวกับ localization & internationalization และรองรับภาษาไทยด้วยครับ รองรับทั้ง Python 2 , Python 3

สามารถโหลดไฟล์บีบอัดมาติดตั้งได้จาก https://pypi.python.org/pypi/PyICU/ แตกไฟล์แล้วใช้คำสั่ง
python setup.py build
python setup.py install

สำหรับผู้อ่านที่ใช้ Windows สามารถโหลดไฟล์ .whl มาติดตั้งได้จาก http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyicu

ตัวอย่างการใช้งาน PyICU ในการ Sort ภาษาไทย

[python]
>>> import icu
>>> collator = icu.Collator.createInstance(icu.Locale('th_TH.UTF-8'))
>>> sorted(['ไก่', 'เป็ด', 'หมู', 'วัว'], key=collator.getSortKey)
['ไก่', 'เป็ด', 'วัว', 'หมู']
[/python]

และมีท่านหนึ่งเสนอว่า ใน Python จะมีไลบรารีพื้นฐานที่ชื่อว่า locale สามารถนำมาใช้ Sort ภาษาไทย โดยการกำหนดค่าการถอดรหัสเป็น th_TH.utf8 โดยจะเรียงตาม th_TH.utf8 ตามรูปแบบภาษาไทย

[python]
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'th_TH.utf8')
>>> my = ['วัว', 'หมู', 'เป็ด', 'ไก่']
>>> sorted(my, key=locale.strxfrm)
['ไก่', 'เป็ด', 'วัว', 'หมู']
[/python]

ขอขอบคุณท่าน Narudom Roongsiriwong และทุก ๆ ท่านที่แบ่งปันความรู้ครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)