Проверка возможности преобразования строки в плавающее в Python

Прокрутите список существующих строк и затем проверьте пустую строку, если она не пуста, заполнить новый список строк непустыми значениями и затем заменить старый список строк новым списком строк

147
задан Augustin 15 September 2017 в 11:18
поделиться

3 ответа

Я бы просто использовал ..

try:
    float(element)
except ValueError:
    print "Not a float"

.. это просто и работает

Еще одним вариантом было бы регулярное выражение:

import re
if re.match(r'^-?\d+(?:\.\d+)?$', element) is None:
    print "Not float"
259
ответ дан 23 November 2019 в 21:33
поделиться

Это регулярное выражение будет проверять научные числа с плавающей запятой:

^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$

Однако я считаю, что лучше всего использовать парсер в попытке.

2
ответ дан 23 November 2019 в 21:33
поделиться

Это должно делать то, что вы хотите:

function notempty($var) {
    return ($var==="0"||$var);
}

Редактировать: я думаю, таблицы работают только в предварительном просмотре, а не в реальных ответах. Поэтому, пожалуйста, обратитесь к таблицам сравнения типов PHP для получения дополнительной информации.

notempty("")       : false
notempty(null)     : false
notempty(undefined): false
notempty(array())  : false
notempty(false)    : false
notempty(true)     : true
notempty(1)        : true
notempty(0)        : false
notempty(-1)       : true
notempty("1")      : true
notempty("0")      : true
notempty("php")    : true

По сути, notempty () - это то же самое, что! Empty () для всех значений, кроме «0», для которых он возвращает ] правда .


Редактировать: Если вы используете error_reporting (E_ALL) , вы не сможете передавать неопределенную переменную в пользовательские функции по значению. И, как указывает mercator, вы должны всегда использовать E_ALL , чтобы соответствовать передовой практике. В этой ссылке (комментарий № 11), которую он предоставляет, обсуждается, почему вы не должны использовать какую-либо форму подавления ошибок в целях производительности и удобства сопровождения / отладки. Мы не ожидаем много недопустимых строк, и в этом случае они потенциально медленнее (вероятно, из-за стоимости обработки исключений).

Опять же, я не предлагаю вам заботиться о производительности, я просто предоставляю вам данные на случай, если вы делать это 10 миллиардов раз в секунду или что-то в этом роде. Кроме того, код на основе разделов не обрабатывает хотя бы одну допустимую строку.

$ ./floatstr.py
F..
partition sad: 3.1102449894
partition happy: 2.09208488464
..
re sad: 7.76906108856
re happy: 7.09421992302
..
try sad: 12.1525540352
try happy: 1.44165301323
.
======================================================================
FAIL: test_partition (__main__.ConvertTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./floatstr.py", line 48, in test_partition
    self.failUnless(is_float_partition("20e2"))
AssertionError

----------------------------------------------------------------------
Ran 8 tests in 33.670s

FAILED (failures=1)

Вот код (Python 2.6, регулярное выражение взято из ответа Джона Гитцена ):

def is_float_try(str):
    try:
        float(str)
        return True
    except ValueError:
        return False

import re
_float_regexp = re.compile(r"^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$")
def is_float_re(str):
    return re.match(_float_regexp, str)


def is_float_partition(element):
    partition=element.partition('.')
    if (partition[0].isdigit() and partition[1]=='.' and partition[2].isdigit()) or (partition[0]=='' and partition[1]=='.' and pa\
rtition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
        return True

if __name__ == '__main__':
    import unittest
    import timeit

    class ConvertTests(unittest.TestCase):
        def test_re(self):
            self.failUnless(is_float_re("20e2"))

        def test_try(self):
            self.failUnless(is_float_try("20e2"))

        def test_re_perf(self):
            print
            print 're sad:', timeit.Timer('floatstr.is_float_re("12.2x")', "import floatstr").timeit()
            print 're happy:', timeit.Timer('floatstr.is_float_re("12.2")', "import floatstr").timeit()

        def test_try_perf(self):
            print
            print 'try sad:', timeit.Timer('floatstr.is_float_try("12.2x")', "import floatstr").timeit()
            print 'try happy:', timeit.Timer('floatstr.is_float_try("12.2")', "import floatstr").timeit()

        def test_partition_perf(self):
            print
            print 'partition sad:', timeit.Timer('floatstr.is_float_partition("12.2x")', "import floatstr").timeit()
            print 'partition happy:', timeit.Timer('floatstr.is_float_partition("12.2")', "import floatstr").timeit()

        def test_partition(self):
            self.failUnless(is_float_partition("20e2"))

        def test_partition2(self):
            self.failUnless(is_float_partition(".2"))

        def test_partition3(self):
            self.failIf(is_float_partition("1234x.2"))

    unittest.main()
5
ответ дан 23 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: