Mam kod Pythona, który przebiega przez listę ciągów znaków i konwertuje je na liczby całkowite lub liczby zmiennoprzecinkowe, jeśli to możliwe. Wykonanie tego dla liczb całkowitych jest dość łatwe
if element.isdigit():
newelement = int(element)
Liczby zmiennoprzecinkowe są trudniejsze. W tej chwili używam partition('.')
do podzielenia łańcucha i sprawdzania, czy jedna lub obie strony są cyframi.
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)
To działa, ale oczywiście instrukcja if jest trochę niedźwiedzia. Innym rozwiązaniem, które rozważałem, jest po prostu zawinięcie konwersji w blok try / catch i sprawdzenie, czy się powiedzie, jak opisano w tym pytaniu .
Czy ktoś ma jakieś inne pomysły? Opinie na temat względnych zalet partycji i podejść do próbowania / łapania?
źródło
Metoda Pythona w celu sprawdzenia liczby zmiennoprzecinkowej:
Nie daj się zwieść goblinom ukrywającym się w łodzi pływającej! ZRÓB TESTOWANIE JEDNOSTKI!
Co jest, a nie jest pływakiem, może cię zaskoczyć:
źródło
isfloat(" 1.23 ")
iisfloat(" \n \t 1.23 \n\t\n")
. Przydatny w żądaniach internetowych; nie trzeba najpierw przycinać białych znaków.który zwróci
true
tylko wtedy, gdy będzie jeden ”lub„ nie ”. w ciągu cyfr.wróci
false
wróci
false
źródło
[i for i in df[i].apply(lambda x: str(x).replace('.','').isdigit()).any()]
TL; DR :
try: except:
metoda jest najlepszą natywną metodą Pythona.Istnieje inna metoda dostępna za pośrednictwem modułu innej firmy o nazwie fastnumbers (ujawnienie, jestem autorem); zapewnia funkcję o nazwie isfloat . Wziąłem najdelikatniejszy przykład przedstawiony przez Jacoba Gabrielsona w tej odpowiedzi , ale dodałem tę
fastnumbers.isfloat
metodę. Powinienem również zauważyć, że przykład Jacoba nie oddał sprawiedliwie opcji regex, ponieważ większość czasu w tym przykładzie spędzono na przeglądach globalnych z powodu operatora kropki ... Zmodyfikowałem tę funkcję, aby uzyskać bardziej sprawiedliwe porównanietry: except:
.Na mojej maszynie dane wyjściowe to:
Jak widać, wyrażenie regularne nie jest tak złe, jak się początkowo wydawało, a jeśli naprawdę potrzebujesz szybkości,
fastnumbers
metoda jest całkiem dobra.źródło
Jeśli zależy Ci na wydajności (i nie sugeruję, że powinieneś), podejście oparte na próbach jest wyraźnym zwycięzcą (w porównaniu z podejściem opartym na partycjach lub wyrażeniem regularnym), o ile nie spodziewasz się dużo niepoprawne ciągi, w którym to przypadku jest to potencjalnie wolniejsze (prawdopodobnie ze względu na koszt obsługi wyjątków).
Ponownie, nie sugeruję, abyś dbał o wydajność, po prostu podałbym dane na wypadek, gdybyś robił to 10 miliardów razy na sekundę, czy coś takiego. Ponadto kod oparty na partycjach nie obsługuje co najmniej jednego prawidłowego ciągu.
Oto kod (Python 2.6, REGEXP zaczerpnięte z Johna Gietzen za odpowiedź ):
źródło
Tylko dla odmiany tutaj jest inna metoda, aby to zrobić.
Edycja: Jestem pewien, że nie wytrzyma wszystkich przypadków liczby zmiennoprzecinkowej, zwłaszcza gdy występuje wykładnik potęgi. Aby rozwiązać, wygląda to tak. Zwróci to wartość True tylko val jest liczbą zmiennoprzecinkową i False dla int, ale prawdopodobnie jest mniej wydajna niż regex.
źródło
Ta regex sprawdzi, czy istnieją naukowe liczby zmiennoprzecinkowe:
Uważam jednak, że najlepszym rozwiązaniem jest użycie parsera podczas próby.
źródło
Jeśli nie musisz się martwić naukowymi lub innymi wyrażeniami liczb i pracujesz tylko z ciągami, które mogą być liczbami z kropką lub bez:
Funkcjonować
Wersja Lambda
Przykład
W ten sposób nie zamieniasz przypadkowo inta w zmiennoprzecinkowe.
źródło
Uproszczona wersja funkcji
is_digit(str)
, która wystarcza w większości przypadków (nie uwzględnia notacji wykładniczej i wartości „NaN” ):źródło
Użyłem już wspomnianej funkcji, ale wkrótce zauważam, że ciągi znaków jako „Nan”, „Inf” i jej odmiana są uważane za liczbę. Proponuję więc ulepszoną wersję funkcji, która zwróci false dla tego typu danych wejściowych i nie zawiedzie wariantów „1e3”:
źródło
if text.isalpha():
czeku od razu?Spróbuj przekonwertować na float. Jeśli wystąpi błąd, wydrukuj wyjątek ValueError.
Wynik:
źródło
Przekazanie słownika jako argumentu spowoduje konwersję ciągów, które można przekonwertować na zmiennoprzecinkowe i pozostawi inne
źródło
Szukałem podobnego kodu, ale wygląda na to, że najlepszym rozwiązaniem jest użycie try / wyjątki. Oto kod, którego używam. Zawiera funkcję ponownej próby, jeśli dane wejściowe są nieprawidłowe. Musiałem sprawdzić, czy dane wejściowe były większe niż 0, a jeśli tak, przekonwertuj je na zmiennoprzecinkowe.
źródło
źródło
Wypróbowałem niektóre z powyższych prostych opcji, używając testu próbnego konwersji na zmiennoprzecinkowe, i odkryłem, że w większości odpowiedzi występuje problem.
Prosty test (zgodnie z powyższymi odpowiedziami):
Problem pojawia się, gdy:
Próbujesz wtedy,
float('-')
co się nie udajeNastępnie próbujesz,
float('')
który również zawiedzieMoje szybkie rozwiązanie to:
źródło
wydaje się być proste.
Obsługuje wartości przechowywane jako ciąg lub int lub zmiennoprzecinkowe
źródło