सवाल मैं पायथन में एक फ्लोट या int में स्ट्रिंग को कैसे पार्स करूं?


पायथन में, मैं एक संख्यात्मक स्ट्रिंग को कैसे पार्स कर सकता हूं "545.2222" इसके संबंधित फ्लोट मूल्य के लिए, 542.2222? या स्ट्रिंग पार्स "31" एक पूर्णांक के लिए, 31?

मैं सिर्फ यह जानना चाहता हूं कि कैसे पार्स करना है नाव  string ए के लिए float, और (अलग से) ए पूर्णांक  string एक को int


1761
2017-12-19 01:52


मूल


एक सामान्य नियम के रूप में, यदि आपके पास पाइथन में कोई ऑब्जेक्ट है, और कन्वर्ट करना चाहते हैं सेवा मेरे उस प्रकार का ऑब्जेक्ट, कॉल करें 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'? पाइथन के मेरे वर्तमान संस्करण में '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
@ जेएफ। सेबेस्टियन आप पूरी तरह से सही हैं, लेकिन ऐसे समय होते हैं जब आप इनपुट को निर्देशित करना चाहते हैं कि यह कौन सा होगा। इनपुट को निर्देश देना कि कौन सा बतख-टाइपिंग के साथ अच्छी तरह से काम कर सकता है। - TimothyAWiseman
आप एक और घोंसला कर सकते हैं try एक अपवाद फेंकने के लिए जब यह फ्लोट करने के लिए परिवर्तनीय नहीं है। - iBug


एक स्ट्रिंग एक फ्लोट है या नहीं, यह जांचने के लिए पायथन विधि:

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

इस फ़ंक्शन के लिए एक लंबा और अधिक सटीक नाम हो सकता है: isConvertibleToFloat(value)

क्या है, और इसमें एक फ्लोट नहीं है अजगर आपको आश्चर्य हो सकता है:

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:

इसका उपयोग अविश्वसनीय स्रोतों से पाइथन अभिव्यक्ति वाले तारों को सुरक्षित रूप से मूल्यांकन करने के लिए किया जा सकता है, बिना मूल्यों को पार्स करने की आवश्यकता के।

यही है, एक सुरक्षित 'eval'

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

104
2018-03-01 04:23



ये है नहीं समस्या का एक अच्छा समाधान। यह पायथन 2 में ठीक काम करता है, लेकिन पाइथन 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



नाइटपिक: चरम मामलों जैसे फ्लोट ("2e-3") के लिए काम नहीं करता है - Emile
नोट: तारों के रूप में पारित धन राशि से निपटने पर सावधान रहें, क्योंकि कुछ देश दशमलव विभाजक के रूप में "," का उपयोग करते हैं - Ben G
@Emile: मैं "2e-3" को "चरम मामला" नहीं कहूंगा। यह जवाब अभी टूटा हुआ है। - jchl
@ बेन्ग एक फ्लोट के रूप में पैसे का उपयोग नहीं करते हैं। वह परेशानी के लिए पूछ रहा है। पैसे के लिए दशमलव का प्रयोग करें! (लेकिन ',' के बारे में आपकी टिप्पणी अभी भी वैध और महत्वपूर्ण है) - ToolmakerSteve
यह न भूलें कि "संख्या नहीं" (NaN) और +/- अनंतता भी मान्य फ्लोट मान हैं। इसलिए float("nan") एक पूरी तरह से मान्य फ्लोट मान है कि उपर्युक्त उत्तर बिल्कुल पकड़ नहीं पाएगा - Ronny Andersson


स्थानीयकरण और अल्पविराम

आपको मामलों के लिए, संख्या के स्ट्रिंग प्रतिनिधित्व में अल्पविराम की संभावना पर विचार करना चाहिए float("545,545.2222") जो एक अपवाद फेंकता है। इसके बजाय, विधियों का उपयोग करें locale तारों को संख्याओं में परिवर्तित करने और अल्पविरामों को सही ढंग से समझने के लिए। 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





उपयोगकर्ता codelogic तथा हार्ले सही हैं, लेकिन अगर आपको पता है कि स्ट्रिंग एक पूर्णांक है (उदाहरण के लिए, 545) तो आप पहले ("545") को फ्लोट करने के बिना पहली बार कास्टिंग कर सकते हैं।

यदि आपके तार एक सूची में हैं, तो आप मानचित्र फ़ंक्शन का भी उपयोग कर सकते हैं।

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

यह केवल तभी अच्छा है जब वे सभी एक ही प्रकार के होते हैं।


22
2017-12-19 02:09





यदि आप तीसरे पक्ष के मॉड्यूल के विपरीत नहीं हैं, तो आप जांच सकते हैं fastnumbers मॉड्यूल। यह एक समारोह प्रदान करता है fast_real यह वही करता है जो यह प्रश्न पूछ रहा है और शुद्ध-पायथन कार्यान्वयन से तेज़ करता है:

>>> 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