เรื่องของการจัดเรียงใน Python



วันก่อนคุยกับ Users เรื่องการจัดเรียงข้อมูล ผมถาม Users ไปว่าต้องการให้จัดเรียงข้อมูลยังไงดีครับ เรียงจากน้อยไปมาก หรือมากไปน้อย? ฟังดูก็น่าจะเป็นคำถามธรรมดาๆสำหรับการเขียนโปรแกรมอย่างนึง แต่คำตอบนี่สิครับ ทำเอางงไปนิดนึง 

ความต้องการที่เกินความคาดหมาย

จากคำถามที่ถาม Users ไปเรื่องการจัดเรียงข้อมูล ผมคาดหวังจะได้คำตอบว่า เรียงตามชื่อนามสกุลตามตัวอักษรจากมากไปน้อยหรือจากน้อยไปมาก หรือเรียงชื่อตำแหน่งตามตัวอักษรจากมากไปน้อยหรือน้อยไปมาก แต่คำตอบที่ผมได้คือ ต้องการเรียงตามชื่อตำแหน่งแบบนี้ cc,bb,aa คือไม่เรียงจากมากไปน้อยหรือจากน้อยไปมาก แต่อยากเรียงตามใจ users

เอาไงดีล่ะ??

ในตอนแรกก็คิดว่า เรียงตามใจแบบนี้ต้องเรียงแบบ Manual แน่ๆ คอมพิวเตอร์ที่ไหนจะมาเรียงตามใจแบบไม่มีหลักการได้ แต่พอกลับมานั่งคิดดู เฮ้ย.. มันทำได้นี่นา

หลักการเรียงแบบตามใจฉัน

จริงๆม้นก็หนีไม่พ้นว่าจะต้องบอกคอมพิวเตอร์แหละว่าจะต้องเรียงยังไง เช่น เรามีข้อมูลดังนี้

[
    { 'mykey': "keyA", 'value': 1 },
    { 'mykey': "keyC", 'value': 2 },
    { 'mykey': "keyB", 'value': 3 },
    { 'mykey': "keyB", 'value': 4 },
    { 'mykey': "keyA", 'value': 5 },
    { 'mykey': "keyB", 'value': 6 },
    { 'mykey': "keyC", 'value': 7 },
    { 'mykey': "keyC", 'value': 8 },
    { 'mykey': "keyC", 'value': 9 },
    { 'mykey': "keyC", 'value': 10 },
]

แล้วต้องการเรียงข้อมูลทั้งหมดให้เป็นแบบนี้ keyB > keyC > keyA

[{'mykey': 'keyB', 'value': 3},                                                                                                             
 {'mykey': 'keyB', 'value': 4},                                                                                                             
 {'mykey': 'keyB', 'value': 6},                                                                                                             
 {'mykey': 'keyC', 'value': 2},                                                                                                             
 {'mykey': 'keyC', 'value': 7},                                                                                                             
 {'mykey': 'keyC', 'value': 8},                                                                                                             
 {'mykey': 'keyC', 'value': 9},                                                                                                             
 {'mykey': 'keyC', 'value': 10},                                                                                                            
 {'mykey': 'keyA', 'value': 1},                                                                                                             
 {'mykey': 'keyA', 'value': 5}] 

มันทำได้นะ

ถ้าเราไม่ปิดกั้นความคิด โดยยึดหลักที่ว่ามันต้องทำได้ มันก็ทำได้จริงๆ สรุปความต้องการของ Users ที่กล่าวมาข้างต้น ทำได้ตาม code ด้านล่างนี้ครับ เผื่อใครสนใจจะนำไปใช้งานต่อ

import pprint

pp = pprint.PrettyPrinter()

lst = [
    { 'mykey': "keyA", 'value': 1 },
    { 'mykey': "keyC", 'value': 2 },
    { 'mykey': "keyB", 'value': 3 },
    { 'mykey': "keyB", 'value': 4 },
    { 'mykey': "keyA", 'value': 5 },
    { 'mykey': "keyB", 'value': 6 },
    { 'mykey': "keyC", 'value': 7 },
    { 'mykey': "keyC", 'value': 8 },
    { 'mykey': "keyC", 'value': 9 },
    { 'mykey': "keyC", 'value': 10 },
    ]

my_order = ['keyB','keyC', 'keyA']

# OPTION 1 
# order = {key: i for i, key in enumerate(my_order)}
# final_sorted = sorted(lst, key=lambda d: order[d['mykey']])

# OPTION 2
final_sorted = sorted(lst, key=lambda v: my_order.index(v['mykey']))

pp.pprint(final_sorted)

คงไม่ขออธิบายโค้ดนะครับ คนเขียน Python น่าจะอ่านรู้เรื่องอยู่แล้ว

Cr: https://stackoverflow.com/questions/34308635/sort-elements-with-specific-order-in-python

How useful was this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 1

No votes so far! Be the first to rate this post.

Leave a Reply

Your email address will not be published. Required fields are marked *