Saya punya beberapa kode Python yang berjalan melalui daftar string dan mengubahnya menjadi bilangan bulat atau angka floating point jika memungkinkan. Melakukan ini untuk bilangan bulat cukup mudah
if element.isdigit():
newelement = int(element)
Angka titik mengambang lebih sulit. Saat ini saya menggunakan partition('.')
untuk membagi string dan memeriksa untuk memastikan bahwa satu atau kedua sisi adalah digit.
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
Ini bekerja, tetapi jelas pernyataan if untuk itu adalah sedikit beruang. Solusi lain yang saya pertimbangkan adalah hanya membungkus konversi dalam blok coba / tangkap dan lihat apakah berhasil, seperti dijelaskan dalam pertanyaan ini .
Adakah yang punya ide lain? Pendapat tentang manfaat relatif dari partisi dan mencoba / menangkap pendekatan?
sumber
Metode python untuk memeriksa float:
Jangan terkecoh oleh para goblin yang bersembunyi di kapal yang mengapung! LAKUKAN UNIT MENGUJI!
Apa itu, dan bukan pelampung mungkin akan mengejutkan Anda:
sumber
isfloat(" 1.23 ")
andisfloat(" \n \t 1.23 \n\t\n")
. Berguna dalam permintaan web; tidak perlu memangkas ruang putih terlebih dahulu.yang akan kembali
true
hanya jika ada satu atau tidak ada '.' dalam deretan digit.akan kembali
false
akan kembali
false
sumber
[i for i in df[i].apply(lambda x: str(x).replace('.','').isdigit()).any()]
TL; DR :
try: except:
metode ini adalah metode Python asli terbaik.Ada metode lain yang tersedia melalui modul pihak ketiga yang disebut fastnumber (pengungkapan, saya penulisnya); ini menyediakan fungsi yang disebut isfloat . Saya telah mengambil contoh unittest yang diuraikan oleh Jacob Gabrielson dalam jawaban ini , tetapi menambahkan
fastnumbers.isfloat
metode. Saya juga harus mencatat bahwa contoh Jacob tidak melakukan keadilan terhadap opsi regex karena sebagian besar waktu dalam contoh tersebut dihabiskan dalam pencarian global karena operator titik ... Saya telah memodifikasi fungsi itu untuk memberikan perbandingan yang lebih adiltry: except:
.Di mesin saya, hasilnya adalah:
Seperti yang Anda lihat, regex sebenarnya tidak seburuk yang terlihat pada awalnya, dan jika Anda benar-benar membutuhkan kecepatan,
fastnumbers
metode ini cukup baik.sumber
Jika Anda peduli dengan kinerja (dan saya tidak menyarankan Anda seharusnya), pendekatan berbasis coba adalah pemenang yang jelas (dibandingkan dengan pendekatan berbasis partisi atau pendekatan regexp), selama Anda tidak mengharapkan banyak string tidak valid, dalam hal ini berpotensi lebih lambat (mungkin karena biaya penanganan pengecualian).
Sekali lagi, saya tidak menyarankan Anda peduli dengan kinerja, hanya memberi Anda data jika Anda melakukan ini 10 miliar kali per detik, atau sesuatu. Juga, kode berbasis partisi tidak menangani setidaknya satu string yang valid.
Berikut kodenya (Python 2.6, regexp diambil dari jawaban John Gietzen ):
sumber
Hanya untuk variasi di sini adalah metode lain untuk melakukannya.
Sunting: Saya yakin itu tidak akan berlaku untuk semua kasus float meskipun terutama ketika ada eksponen. Untuk menyelesaikannya terlihat seperti ini. Ini akan mengembalikan True only val adalah float dan False untuk int tetapi mungkin kurang berkinerja daripada regex.
sumber
Regex ini akan memeriksa nomor floating point ilmiah:
Namun, saya percaya bahwa cara terbaik Anda adalah menggunakan parser dalam mencoba.
sumber
Jika Anda tidak perlu khawatir tentang ekspresi angka atau ilmiah dan hanya bekerja dengan string yang bisa berupa angka dengan atau tanpa tanda titik:
Fungsi
Versi lambda
Contoh
Dengan cara ini Anda tidak sengaja mengubah apa yang seharusnya menjadi int, menjadi pelampung.
sumber
Versi fungsi
is_digit(str)
yang disederhanakan , yang mencukupi dalam kebanyakan kasus (tidak mempertimbangkan notasi eksponensial dan nilai "NaN" ):sumber
Saya menggunakan fungsi yang telah disebutkan, tetapi segera saya melihat bahwa string sebagai "Nan", "Inf" dan variasi itu dianggap sebagai angka. Jadi saya usulkan versi perbaikan fungsi, yang akan mengembalikan false pada tipe input tersebut dan tidak akan gagal varian "1e3":
sumber
if text.isalpha():
cek segera?Cobalah untuk mengkonversi ke float. Jika ada kesalahan, cetak pengecualian ValueError.
Keluaran:
sumber
Melewati kamus sebagai argumen, itu akan mengkonversi string yang dapat dikonversi menjadi float dan akan meninggalkan yang lain
sumber
Saya sedang mencari beberapa kode yang serupa, tetapi sepertinya menggunakan try / exception adalah cara terbaik. Ini kode yang saya gunakan. Ini mencakup fungsi coba lagi jika input tidak valid. Saya perlu memeriksa apakah input lebih besar dari 0 dan jika demikian konversikan ke float.
sumber
sumber
Saya mencoba beberapa opsi sederhana di atas, menggunakan uji coba sekitar mengkonversi ke float, dan menemukan bahwa ada masalah di sebagian besar balasan.
Tes sederhana (sesuai dengan jawaban di atas):
Masalahnya muncul ketika:
Anda kemudian mencoba
float('-')
yang gagalAnda kemudian mencoba
float('')
yang juga gagalSolusi cepat yang saya miliki adalah:
sumber
tampaknya sederhana.
Menangani nilai yang disimpan sebagai string atau int atau float
sumber