Kaip analizuoti eilutę, kurioje Python yra plūduriuojantis taškas arba int?

Kaip „Python“ gali suprasti skaitmeninę eilutę, pvz., "545.2222" į tinkamą slankiojo taško vertę, 545.2222 ? Arba išanalizuokite eilutę "31" į sveikąjį skaičių 31 ?

Aš tiesiog noriu žinoti, kaip analizuoti „flor str kad float , ir (atskirai) int strint .

1902 m
19 дек. nustatė Tristan Havelick gruodžio 19 d 2008-12-19 04:52 '08 at 4:52 2008-12-19 04:52
@ 26 atsakymai
 >>> a = "545.2222" >>> float(a) 545.22220000000004 >>> int(float(a)) 545 
2257
19 дек. Atsakymą pateikė Harley Holcombe gruodžio 19 d 2008-12-19 04:54 '08 at 4:54 2008-12-19 04:54
 def num(s): try: return int(s) except ValueError: return float(s) 
border=0
462
19 дек. Atsakymą pateikė Javieras gruodžio 19 d. 2008-12-19 05:31 '08 at 5:31 2008-12-19 05:31

Python metodas, skirtas patikrinti, ar eilutė yra plūduriuojantis taškas:

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

Ilgesnis ir tikslesnis šios funkcijos pavadinimas gali būti: is_convertible_to_float(value)

Kas yra ir nėra „ Python“ plūduras, gali jus nustebinti:

 val is_float(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 

Ar manote, kad žinote, kurie numeriai? Jūs nesate toks geras, kaip manote! Ne didelis siurprizas.

450
05 янв. Atsakymą pateikė Eric Leschinski 05 sausis 2014-01-05 07:15 '14 at 7:15 2014-01-05 07:15

Tai dar vienas būdas, kurį verta paminėti čia, ast.literal_eval :

Tai gali būti naudojama saugiai įvertinti eilutes, turinčias Python išraiškas iš nepatikimų šaltinių, nepriklausomai analizuojant vertes.

Tai yra saugus „eval“

 >>> import ast >>> ast.literal_eval("545.2222") 545.2222 >>> ast.literal_eval("31") 31 
112
01 марта '12 в 7:23 2012-03-01 07:23 atsakymas pateikiamas kovo 1 d. 12 d., 07:23 AM 2012-03-01 07:23
 float(x) if '.' in x else int(x) 
77
19 дек. Atsakymą Dino Viehland pateikė gruodžio 19 d. 2008-12-19 05:32 '08 ne 5:32 2008-12-19 05:32

Lokalizavimas ir kableliai

Turėtumėte apsvarstyti galimybę kableliuose nurodyti skaičių kablelius, jei tipo float("545,545.2222") . Vietoj to naudokite locale metodus, norėdami konvertuoti eilutes į skaičius ir teisingai interpretuoti kablelius. Metodas „ locale.atof konvertuojamas į plūdę vienu žingsniu po to, kai buvo nustatytas susitarimas dėl reikiamo kiekio.

1 pavyzdys - JAV simboliai

Jungtinėse Amerikos Valstijose ir Jungtinėje Karalystėje kablelius galima naudoti kaip tūkstančius separatorių. Šiame amerikiečių kalbos pavyzdyje kablelis teisingai traktuojamas kaip ribotuvas:

 >>> 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 pavyzdys. Europos konvencija

Daugelyje pasaulio šalių kableliai naudojami vietoj dešimtainių taškų. Šiame Prancūzijos pavyzdyje kablelis teisingai laikomas dešimtainiu ženklu:

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

Taip pat galima rasti locale.atoi metodą, tačiau argumentas turi būti sveikas skaičius.

55
23 июля '13 в 19:00 2013-07-23 19:00 atsakymą pateikė Markas Chackerianas liepos 13 d. 13 val. 19:00 val. 2013-07-23 19:00

Jei nesate atokūs nuo trečiųjų šalių modulių, galite patikrinti „ fastnumbers“ modulį. Ji suteikia funkciją, vadinamą „ fast_real“ , kuri daro būtent tai, ką užduoda šis klausimas, ir tai veikia greičiau nei „Python“ įgyvendinimas:

 >>> 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 
23
14 авг. Atsakymas pateikiamas SethMMorton 14 rug . 2014-08-14 06:21 '14, 6:21 AM 2014-08-14 06:21

Kodeloginiai ir harley naudotojai yra teisingi, tačiau nepamirškite, kad jei žinote, kad eilutė yra sveikasis skaičius (pvz., 545), galite skambinti int ("545") be pirmojo plaukimo.

Jei jūsų eilutės yra išvardytos, galite naudoti ir žemėlapio funkciją.

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

Gerai, jei jie visi yra vienodi.

23
19 дек. Chris Cameron atsakymas, gruodžio 19 d 2008-12-19 05:09 '08 at 5:09 2008-12-19 05:09

Kaip „Python“, kaip galiu analizuoti skaitmeninę eilutę, pvz., „545.2222“, į tinkamą slankiojo kablelio reikšmę, 542.2222? Arba išanalizuokite eilutę „31“ į sveikąjį skaičių 31? Aš tiesiog noriu žinoti, kaip analizuoti eilutę su kintamuoju tašku į slankiojo kablelio numerį, ir (atskirai) eilutę int į int.

Geras dalykas, kurį prašote tai padaryti atskirai. Jei juos sumaišysite, vėliau galite išspręsti problemas. Paprastas atsakymas yra:

"545.2222" plaukimui:

 >>> float("545.2222") 545.2222 

"31" sveikasis skaičius:

 >>> int("31") 31 

Kitos konversijos, sveikieji skaičiai į eilutes ir literatūrą:

Konversijos iš skirtingų duomenų bazių ir iš anksto turite žinoti duomenų bazę (numatytasis 10). Atkreipkite dėmesį, kad galite pridėti prie jų „Python“ iš savo literatūros tikimybės (žr. Žemiau) arba pašalinti prefikso:

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

Jei nežinote pagrindo iš anksto, bet žinote, kad jie turi teisingą priešdėlį, „Python“ gali tai padaryti už jus, jei perkeliate 0 kaip pagrindą:

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

Ne dešimtainiai (ty Integer) literatūros iš kitų bazių

Jei jūsų motyvacija yra, kad jūsų kodas aiškiai atspindėtų tam tikras koduotas konkrečias vertes, jums gali tekti konvertuoti iš duomenų bazių - galite leisti „Python“ tai padaryti automatiškai su teisinga sintaksė.

Galite naudoti apropos prefiksus, kad automatiškai konvertuoti į sveikus skaičius su šiais skaičiais . Jie galioja 2 ir 3 Python:

Binarinis prefiksas 0b

 >>> 0b11111 31 

Octal prefiksas 0o

 >>> 0o37 31 

Šešioliktainis prefiksas 0x

 >>> 0x1f 31 

Tai gali būti naudinga, kai aprašomi dvejetainiai vėliavos, failų leidimai kode arba šešioliktainės spalvų reikšmės - pvz., Nepridėkite kabučių:

 >>> 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“ suderinamas su „Python 3“

Jei matote sveikąjį skaičių, kuris prasideda 0, Python 2 tai yra (nerekomenduojama) aštunto sintaksė.

 >>> 037 31 

Tai blogai, nes atrodo, kad vertė turėtų būti 37 . Todėl „Python 3“ dabar atsiranda „ SyntaxError :

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

Konvertuokite 2 „Python“ oktalinius numerius į oktalinius numerius, kurie veikia tiek 2, tiek 3, su prefiksu 0o :

 >>> 0o37 31 
18
23 июля '15 в 16:26 2015-07-23 16:26 atsakymą pateikė Aaron Hall liepos 15 d. 15:26 2015-07-23 16:26

Šis klausimas atrodo šiek tiek senas. Tačiau leiskite man pasiūlyti parseStr funkciją, kuri daro kažką panašaus, tai yra, grąžinti sveikąjį skaičių arba plūdę, ir jei tam tikra ASCII eilutė negali būti konvertuojama į bet kurį iš jų, ji grąžina ją nepažeistą. Žinoma, kodą galima koreguoti, kad galėtumėte atlikti tik tai, ko norite:

  >>> 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' 
18
28 сент. atsakymas pateikiamas krzym 28 sep . 2011-09-28 22:45 '11, 22:45, 2011-09-28 22:45

float("545.2222") ir int(float("545.2222"))

15
19 дек. Atsakymas duotas kodiniu būdu . 2008-12-19 04:54 '08 at 4:54 2008-12-19 04:54

YAML“ analizatorius padės jums suprasti, kuris duomenų tipas yra jūsų eilutė. Naudokite yaml.load() , tada galite naudoti type(result) kad patikrintumėte tipą:

 >>> import yaml >>> a = "545.2222" >>> result = yaml.load(a) >>> result 545.22220000000004 >>> type(result) <type 'float'> >>> b = "31" >>> result = yaml.load(b) >>> result 31 >>> type(result) <type 'int'> >>> c = "HI" >>> result = yaml.load(c) >>> result 'HI' >>> type(result) <type 'str'> 
13
16 апр. Rafe atsakymas, pateiktas balandžio 16 d 2013-04-16 06:03 '13, 6:03, 2013-04-16 06:03
 def get_int_or_float(v): number_as_float = float(v) number_as_int = int(number_as_float) return number_as_int if number_as_float == number_as_int else number_as_float 
11
08 окт. Atsakyti Totoro Oct 08 2015-10-08 16:39 '15, 16:39 pm 2015-10-08 16:39

Aš naudoju šią funkciją

 import ast def parse_str(s): try: return ast.literal_eval(str(s)) except: return 

Konvertuoja eilutę, kurią norite įvesti.

 value = parse_str('1') # Returns Integer value = parse_str('1.5') # Returns Float 
11
09 июля '17 в 11:02 2017-07-09 11:02 atsakymas duotas „ Shameem“ liepos 09 d. 17 val. 11:02 2017-07-09 11:02

Norėdami tai padaryti, apsvarstykite apvalinimą.

t.y. int (5.1) => 5 int (5.6) => 5 - neteisinga, ji turėtų būti 6, todėl mes int (5.6 + 0.5) => 6

 def convert(n): try: return int(n) except ValueError: return float(n + 0.5) 
7
21 окт. atsakymas pateikiamas Nick 21 okt. 2010-10-21 17:10 '10, 17:10, 2010-10-21 17:10
 def num(s): """num(s) num(3),num(3.7)-->3 num('3')-->3, num('3.7')-->3.7 num('3,700')-->ValueError num('3a'),num('a3'),-->ValueError num('3e4') --> 30000.0 """ try: return int(s) except ValueError: try: return float(s) except ValueError: raise ValueError('argument is not a string of number') 
7
09 окт. atsakymas pateikiamas Jerry T 09 okt. 2015-10-09 21:04 '15 - 21:04 2015-10-09 21:04

Nustebiu, kad niekas nemini reguliarios išraiškos, nes kartais eilutė turi būti parengta ir normalizuota prieš pradedant skaityti

 import re def parseNumber(value, as_int=False): try: number = float(re.sub('[^.\-\d]', '', value)) if as_int: return int(number + 0.5) else: return number except ValueError: return float('nan') # or None if you wish 

naudoti:

 parseNumber('13,345') > 13345.0 parseNumber('- 123 000') > -123000.0 parseNumber('99999\n') > 99999.0 

ir, beje, kažkas, kad patikrintumėte, ar turite numerį:

 import numbers def is_number(value): return isinstance(value, numbers.Number) # will work with int, float, long, Decimal 
5
12 июля '17 в 20:01 2017-07-12 20:01 atsakymą pateikė Sławomiras Lenartas liepos 17 d. 17 val. 20:01 2017-07-12 20:01

„Python“ turi tokį didelį lankstumą, kaip analizuoti vieną linijinį laivą.

 str = "545.2222" print ("int: ", + int(float(a))) print ("float: ", +(float(a))) 
4
01 марта '18 в 19:32 2018-03-01 19:32 atsakymą pateikė Harry_pb kovo 1 d. 18 d. 19:32 2018-03-01 19:32

Jei norite įvesti „Python“, naudokite tipo konstruktoriaus funkcijas, perduodant eilutę (arba bet kurią vertę, kurią bandote perduoti) kaip parametrą.

Pavyzdžiui:

 >>>float("23.333") 23.333 

Užkulisiuose „python“ skambina __float__ objektų metodu, kuris turėtų grąžinti parametro __float__ . Tai ypač __float__ nes galite nustatyti savo tipus (naudodami klases), naudodami __float__ metodą __float__ kad jis galėtų būti konvertuojamas į plūdę naudojant plūdę (myobject).

4
01 июля '18 в 23:42 2018-07-01 23:42 atsakymas pateikiamas qwerty12345 liepos 1 d. 18 val. 11:42 pm 2018-07-01 23:42

Tai patikslinta ngn-wiki.ru.site/questions/785 / ...

Ji bandys išanalizuoti eilutę ir grąžinti arba int arba float , priklausomai nuo to, ką reiškia eilutė. Tai gali lemti išimčių analizę arba turėti netikėtą elgesį .

  def get_int_or_float(v): number_as_float = float(v) number_as_int = int(number_as_float) return number_as_int if number_as_float == number_as_int else number_as_float 
3
18 мая '17 в 10:28 2017-05-18 10:28 Kuzeko atsakymas gegužės 18 d. 17 d., 10:28 2017-05-05 10:28

Galite naudoti str() konvertuoti bet kurį kintamąjį į eilutę, int() norėdami konvertuoti eilės sveikus skaičius į sveikus skaičius, ir float() norite konvertuoti eilutės numerius į slankiąją vertę.

 str_to_float = float("545.2222") str_to_int = int("31") 
2
13 окт. atsakymą pateikė Khandelwal-manik , spalio 13 d 2018-10-13 09:31 '18, 9:31 ; 2018-10-13 09:31

Naudoti:

 def num(s): try: for each in s: yield int(each) except ValueError: yield float(each) a = num(["123.55","345","44"]) print a.next() print a.next() 

Tai yra pats pythoninis būdas, kurį galėčiau sugalvoti.

1
09 окт. atsakymas suteiktas SeasonalShot 09 oct. 2016-10-09 08:40 '16 at 8:40 am 2016-10-09 08:40

Naudoti:

 >>> str_float = "545.2222" >>> float(str_float) 545.2222 >>> type(_) # Check its type <type 'float'> >>> str_int = "31" >>> int(str_int) 31 >>> type(_) # Check its type <type 'int'> 
0
11 сент. atsakymas suteiktas 11 m. 2016-09-11 17:32 '16 at 17:32 pm 2016-09-11 17:32

Jei žinote, jis gali būti tik int:

 return int(s) if s.isdigit() else float(s) 
0
20 дек. Atsakymą pateikė Yakir Tsuberi . 2018-12-20 12:11 '18, 12:11 val. 2018-12-20 12:11

Eval yra gera galimybė išspręsti šią problemą.

 a = "545.2222" try: print int(eval(a)) except: pass 
0
03 дек. atsakymas pateikiamas 03 val. 2017-12-03 02:26 '17 at 2:26 2017-12-03 02:26

Čia yra dar vienas jūsų klausimo aiškinimas (užuomina: tai neapibrėžta). Galbūt ieškote kažko panašaus:

 def parseIntOrFloat( aString ): return eval( aString ) 

Jis veikia kaip šis ...

 >>> parseIntOrFloat("545.2222") 545.22220000000004 >>> parseIntOrFloat("545") 545 

Teoriškai yra pažeidžiamas injekcijos. Straipsnis gali būti, pavyzdžiui, "import os; os.abort()" . Tačiau be jokios informacijos apie tai, iš kur atsirado ši linija, yra teorinė spekuliacija. Kadangi klausimas yra neaiškus, nėra visiškai aišku, ar šis pažeidžiamumas iš tikrųjų egzistuoja, ar ne.

-10
19 дек. Atsakymą S.Lott pateikė gruodžio 19 d. 2008-12-19 05:29 '08 at 5:29 2008-12-19 05:29