Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Melaksanakan Pengisihan Semula Jadi untuk Rentetan yang Mengandungi Nombor dan Terapung dalam Python?

Bagaimanakah Saya Boleh Melaksanakan Pengisihan Semula Jadi untuk Rentetan yang Mengandungi Nombor dan Terapung dalam Python?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-02 08:54:09536semak imbas

How Can I Implement Natural Sorting for Strings Containing Numbers and Floats in Python?

Isih Semulajadi untuk Rentetan dengan Nombor

Apabila mengisih rentetan yang mengandungi nombor, kaedah pengisihan lalai mungkin tidak menghasilkan hasil yang diingini. Sebagai contoh, rentetan "something12" mungkin diletakkan selepas "something2" dan bukannya sebelum itu.

Untuk membetulkannya, kita boleh menggunakan pengisihan semula jadi, yang mengambil kira nombor dalam rentetan. Begini caranya:

Mengimport Modul yang Diperlukan:

Pertama, kami mengimport modul semula untuk pengendalian ekspresi biasa.

import re

Mentakrifkan Fungsi Pembantu:

Kami mentakrifkan fungsi pembantu untuk menukar rentetan kepada integer dan terapung:

def atoi(text):
    return int(text) if text.isdigit() else text

def atof(text):
    try:
        retval = float(text)
    except ValueError:
        retval = text
    return retval

Mentakrifkan Fungsi Isih Semulajadi:

Fungsi natural_keys membahagi rentetan kepada bahagian konstituennya menggunakan ungkapan biasa:

def natural_keys(text):
    return [atoi(c) for c in re.split(r'(\d+)', text)]

Isih dengan Semulajadi Kekunci:

Menggunakan fungsi natural_keys sebagai kunci untuk mengisih meletakkan rentetan dalam susunan semula jadi:

alist = ["something1", "something12", "something17", "something2", "something25", "something29"]
alist.sort(key=natural_keys)
print(alist)

Output:

['something1', 'something2', 'something12', 'something17', 'something25', 'something29']

Mengendalikan Terapung:

Untuk mengisih rentetan yang mengandungi terapung, ubah suai ungkapan biasa dalam natural_keys untuk memadankan terapung:

def natural_keys(text):
    return [atof(c) for c in re.split(r'[+-]?([0-9]+(?:[.][0-9]*)?|[.][0-9]+)', text)]

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pengisihan Semula Jadi untuk Rentetan yang Mengandungi Nombor dan Terapung dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn