Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python – เรียงลำดับลิสต์สตริงตามส่วนตัวเลขในสตริง

บทความนี้สาธิตวิธีเรียงลำดับลิสต์ของสตริงโดยใช้ตัวเลขที่อยู่ภายในสตริงเป็นเกณฑ์การเรียง โดยใช้ Regular Expression (Regex)

โค้ดตัวอย่าง

import re

def extract_first_number(text):
    """ดึงตัวเลขตัวแรกที่พบในสตริง"""
    match = re.search(r'\d+', text)
    return int(match.group()) if match else 0

# หรือใช้ findall แบบเดิม
def extract_numbers(text):
    """ดึงตัวเลขทั้งหมดในสตริง"""
    return list(map(int, re.findall(r'\d+', text)))

# ข้อมูลทดสอบ
my_list = ['pyt23hon', 'fu30n', 'lea14rn', 'co00l', 'ob8uje3345t']
print("ลิสต์ต้นฉบับ:")
print(my_list)

# เรียงโดยใช้ตัวเลขตัวแรกเป็น Key
my_list.sort(key=extract_first_number)

print("\nลิสต์หลังเรียงตามตัวเลขตัวแรก:")
print(my_list)

ผลลัพธ์

ลิสต์ต้นฉบับ:
['pyt23hon', 'fu30n', 'lea14rn', 'co00l', 'ob8uje3345t']

ลิสต์หลังเรียงตามตัวเลขตัวแรก:
['co00l', 'ob8uje3345t', 'lea14rn', 'pyt23hon', 'fu30n']
#  00        8           14         23         30

อธิบาย Regex Pattern

  • \d+ = ตัวเลข 1 หลักขึ้นไป
  • re.findall() หาตัวเลขทั้งหมดในสตริง
  • re.search() หาตัวเลขตัวแรกที่เจอ (เร็วกว่า)

กรณีพิเศษ: ตัวเลขนำหน้าด้วยศูนย์ (Leading Zeros)

# 'co00l' → พบ '00' → int('00') = 0
# 'ob8uje3345t' → พบ '8' → int('8') = 8
# เรียงได้ถูกต้องเพราะแปลงเป็น int แล้ว

การประยุกต์ใช้

  • เรียงไฟล์: file1.txt, file2.txt, file10.txt → เรียงเป็น 1, 2, 10 (Natural Sort)
  • จัดลำดับรหัสสินค้า: PROD-001, PROD-010, PROD-002
  • ประมวลผล Log ที่มี Timestamp/ID อยู่ในข้อความ

Natural Sort แบบสมบูรณ์ (แนะนำ)

import re

def natural_sort_key(text):
    """Key สำหรับ Natural Sort - แยกตัวเลขและตัวอักษร"""
    return [int(c) if c.isdigit() else c.lower() for c in re.split(r'(\d+)', text)]

files = ['file1.txt', 'file10.txt', 'file2.txt', 'File20.txt']
files.sort(key=natural_sort_key)
print(files)  # ['file1.txt', 'file2.txt', 'file10.txt', 'File20.txt']