Питання Як я можу проаналізувати рядок на поплавці чи int в Python?


У Python, як я можу проаналізувати числовий рядок, як "545.2222" до відповідного значення плаваючого значення 542.2222? Або проаналізувати рядок "31" до цілого числа 31?

Я просто хочу знати, як розібрати a плавати  string до a float, і (окремо) а Інт  string до int.


1761
2017-12-19 01:52


походження


Як правило, якщо у вас є об'єкт у Python і ви хочете конвертувати до цей тип об'єкта, дзвоніть type(my_object) на ньому. Результат, як правило, може називатися функцією перетворення. Наприклад type(100) призводить до int, тому ви можете зателефонувати int(my_object) спробувати конвертувати my_object до цілого числа. Це не завжди працює, але це хороший "перший припущення" при кодуванні. - robertlayton


Відповіді:


>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

2087
2017-12-19 01:54



просто цікаво, чому в кінці "04"? чому б не просто "00"? також моя поточна версія python не має "04". - Mangat Rai Modi
@MangatRaiModi Номери з плаваючою точкою за своєю суттю недосконалі для представлення десятих знаків. Для отримання додаткової інформації див stackoverflow.com/q/21895756/931277 - dokkaebi
чому б не просто int(a) але int(float(a)) ? - user463035818
int(a) дасть помилку, що рядок не є чинним цілим числом: ValueError: invalid literal for int() with base 10: '545.222', але перетворення з поплавка в int є підтримуваною конверсією. - David Parks


def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

443
2017-12-19 02:31



неявний змішування поплавців / інків може призвести до витончених помилок через можливу втрату точності при роботі з поплавками чи різними результатами для / оператор на поплавці / інЦ. Залежно від контексту, може бути краще повернути або int або float, а не обидва. - jfs
@ J.F.Sebastian Ви повністю правильні, але є моменти, коли ви хочете, щоб вхід визначив, який з них він буде. Даючи вхід, диктуйте, який з них може добре працювати з набором качок. - TimothyAWiseman
Ви можете гніздити інший try викинути виняток, коли це не конвертоване до плавання. - iBug


Метод Python для перевірки, чи є рядок поплавцем:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

Довше та точніше ім'я цієї функції може бути: isConvertibleToFloat(value)

Що таке, і це не поплавець Python може вас здивувати:

val                   isfloat(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Ви думаєте, ви знаєте, які цифри? Ви не так добре, як ви думаєте! Не великий сюрприз.


416
2018-01-05 04:15



Будь ласка, подумайте про перейменування вашої функції на convertibleToFloat або щось подібне (поточне ім'я здається мені заплутаним, принаймні для мене). - MKPS


Це ще один метод, який заслуговує на увагу тут ast.literal_eval:

Це може бути використано для безпечної оцінки рядків, що містять вирази Python з ненадійних джерел, без необхідності аналізувати значення самостійно.

Тобто, безпечний "eval"

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

104
2018-03-01 04:23



це ні гарне рішення проблеми. Він чудово працює в Python 2, але в Python 3 відбувається наступне: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>   Щоб з'ясувати, чому це проблема, якщо ви хочете залишити телефонні номери самостійно, а не вважати, що вони є математичними виразами, то цей підхід не для вас. - royce3
@ royce3 Так, це хороший момент, і користувачі повинні остерігатися. Спочатку ця поведінка була модифікована для вирішення деяких проблем з аналізом складних літералів. Це, мабуть, помилка ast.literal_eval, і обговорювалися тут. - wim


float(x) if '.' in x else int(x)

74
2017-12-19 02:32



Nitpick: не працює для екстремальних випадків, як плаваюча ("2e-3") - Emile
Примітка. Будьте обережні, коли звертаєтесь до грошової суми, переданої як рядки, оскільки деякі країни використовують "," як десяткові роздільники - Ben G
@Emile: Я б не назвав "2e-3" "крайнім випадком". Ця відповідь просто зламана. - jchl
@BenG НЕ маніпулюйте грошима як плаваючою. Це вимагає проблем. Використовуйте десяткову для грошей! (Але ваш коментар щодо "," як і раніше дійсний і важливий) - ToolmakerSteve
Не забувайте, що "не число" (NaN) і +/- нескінченність також є дійсними значеннями "float". Так float("nan") це цілком справедлива плаваюча цінність, що наведена вище відповідь не зловить взагалі - Ronny Andersson


Локалізація та коми

Ви повинні розглянути можливість коми в рядок представлення числа, для випадків, як float("545,545.2222") що кидає виняток. Замість цього використовуйте методи в locale перетворити рядки на чисел і правильно коментувати. The locale.atof метод перетворюється на поплавок в один крок, коли локаль встановлено для бажаного конвенції кількості.

Приклад 1 - Умовні номери США 

У Сполучених Штатах та Великобританії коми можна використовувати як тисячі сепараторів. У цьому прикладі з американським мовою, кома правильно обробляється як роздільник:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Приклад 2 - конвенції європейських номерів

В більшість країн світу, коми використовуються для десяткових знаків замість періодів. У цьому прикладі з французькою мовою кома правильно обробляється як десяткова знака:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Метод locale.atoi також доступний, але аргумент повинен бути цілим числом.


45
2017-07-23 16:00





Користувачі коделогічний і Харлі є правильними, але майте на увазі, якщо ви знаєте, що рядок є цілим числом (наприклад, 545), ви можете викликати int ("545") без першого виклику для плавання.

Якщо ваші рядки в списку, ви також можете використовувати функцію карти.

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

Це добре, якщо вони все однотипні.


22
2017-12-19 02:09





Якщо ви не проти сторонніх модулів, ви можете перевірити швидкі номери модуль Вона надає функцію називається fast_real що робить саме те, про що запитує це питання, і робить це швидше, ніж реалізація чистого Python:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

21
2017-08-14 03:21





У Python, як я можу проаналізувати числовий рядок, як "545.2222", до відповідного значення float, 542.2222? Або проаналізувати рядок "31" на ціле, 31?   Я просто хочу знати, як проаналізувати поплавковий рядок на поплавці та (окремо) int-рядок до int.

Добре, що ви просите зробити це окремо. Якщо ви змішуєте їх, ви можете налаштувати себе на проблеми пізніше. Проста відповідь:

"545.2222" плавати:

>>> float("545.2222")
545.2222

"31"до цілого числа:

>>> int("31")
31

Інші конверсії, вклади в рядки та літерали та від літератури:

Конверсії з різних баз, і ви повинні знати базу заздалегідь (10 є за замовчуванням). Зверніть увагу, що ви можете привласнити їм те, що Python очікує від своїх літералів (див. Нижче) або видалити префікс:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

Якщо ви не знаєте базування заздалегідь, але ви знаєте, що вони матимуть правильний префікс, Python може це зробити для вас, якщо ви передасте 0 як база:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

Нетермінові (тобто цілі) літералі з інших баз

Якщо ваша мотивація полягає в тому, щоб ваш власний кодекс чітко представляв певні значення з жорстким кодуванням, можливо, вам не знадобиться конвертувати з бази - ви можете дозволити Python зробити це для вас автоматично за допомогою правильного синтаксису.

Ви можете використовувати префікси, щоб отримати автоматичне перетворення в цілі числа з наступні літерали. Це дійсно для Python 2 та 3:

Двійковий, префікс 0b

>>> 0b11111
31

Ось, префікс 0o

>>> 0o37
31

Шістнадцятковий префікс 0x

>>> 0x1f
31

Це може бути корисним при описі бінарних прапорів, прав доступу до файлів у коді або шестигранних значень для кольорів, наприклад, примітка не містить лапок:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

Встановлення неоднозначного Python 2 октала сумісно з Python 3

Якщо ви бачите ціле число, яке починається з 0, у Python 2 це (застарілий) восьмий синтаксис.

>>> 037
31

Це погано, тому що, як видається, має бути значення 37. Так що в Python 3 він тепер піднімає a SyntaxError:

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

Перетворіть Python 2 октали на вісімкові вікна, які працюють як у 2, так і 3 з 0o префікс:

>>> 0o37
31

17
2017-07-23 13:26





Питання виглядає трохи застарілим. Але дозвольте запропонувати функцію parseStr, яка робить щось подібне, тобто повертає ціле або плаваюче значення, і якщо даний рядок ASCII не може бути перетворений ні в одне з них, він повертає його недоторканим. Код, звичайно, може бути налаштований, щоб зробити лише те, що ви хочете:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'

16
2017-09-28 19:45



1e3 це номер у python, але рядок у відповідності з вашим кодом. - Cees Timmerman