Skip to main content

Askboon

การจัดเรียงตามลำดับที่ต้องการใน Python

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

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

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[
    { '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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[
    { '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 ด้านล่างนี้ครับ เผื่อใครสนใจจะนำไปใช้งานต่อ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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