แนวคิด
เรียงตัวเลขในลิสต์ตาม "รูปแบบหลักตัวเลข" (digit-wise) ไใช่ค่าตัวเลข โดย padding ด้วย 'a' (หรือตัวอักษรสูงสุด) เพื่อเปรียบเทียบ lexicographically
ตัวอย่างโค้ด
my_list = [4344, 2611, 122, 541, 33, 892, 48292, 460, 390, 120, 10, 2909, 11239, 1]
print("ลิสต์:", my_list)
my_list.sort()
print("เรียงปกติ (numeric):", my_list)
# Digit-wise sort
str_list = list(map(str, my_list))
max_len = max(len(s) for s in str_list)
# Left-justify ด้วย 'a' (char สูงกว่า '9' ใน ASCII)
result = sorted(my_list, key=lambda x: str(x).ljust(max_len, 'a'))
print("เรียงตามหลัก (digit-wise):", result)
ผลลัพธ์
ลิสต์: [4344, 2611, 122, 541, 33, 892, 48292, 460, 390, 120, 10, 2909, 11239, 1]
เรียงปกติ (numeric): [1, 10, 33, 120, 122, 390, 460, 541, 892, 2611, 2909, 4344, 11239, 48292]
เรียงตามหลัก (digit-wise): [10, 11239, 120, 122, 1, 2611, 2909, 33, 390, 4344, 460, 48292, 541, 892]
คำอธิบาย
- แปลงเป็นสตริง ทุกตัว
- หาความยาวสูงสุด (5 หลัก: 48292, 11239)
ljust(5, 'a')เติม 'a' ด้านขวา: '1' -> '1aaaa', '10' -> '10aaa', '11239' -> '11239'- เรียง lexicographic: '10aaa' < '11239' < '120aa' < '122aa' < '1aaaa' < ...
- ทำให้ 10 (ขึ้นต้น 1,0) อยู่ก่อน 1 (1aaaa) เพราะ '0' < 'a'
กรณีใช้งาน
การเรียง "Natural sort" หรือ "Version sort" (1.2, 1.10, 1.9) ต้องใช้ library natsort หรือ custom key ที่ซับซ้อนกว่านี้