2011-04-09 9 views
9

मुझे यह एक और जवाब नहीं मिला जब मैं चाहता था, इसलिए मैंने सोचा कि मैं किसी और के लिए अपना स्वयं का समाधान पोस्ट करूंगा और अगर मैंने कुछ गलत किया है तो सुधार भी प्राप्त करें।मैं स्ट्रिंग को int पर प्राथमिकता के साथ या तो int या float में कैसे परिवर्तित कर सकता हूं?

मुझे एक स्वचालित कॉन्फ़िगरेशन फ़ाइल पार्सर बनाना था और यदि संभव हो तो मैं संख्याएं int बनाना चाहता था और यदि नहीं तो फ्लोट करना चाहता था। सामान्य प्रयास/रूपांतरण को छोड़कर खुद ही काम नहीं करता है क्योंकि किसी भी फ्लोट को केवल एक int के लिए मजबूर किया जाएगा।

किसी से पूछे जाने के रूप में स्पष्टीकरण के लिए, मामला मूल रूप से संख्याओं को रूपांतरित करने के लिए होता है क्योंकि वह व्यक्ति कॉन्फ़िगरेशन फ़ाइल डेटा लिखता है। तो दशमलव के साथ कुछ भी संभवतः एक फ्लोट होने का इरादा रखेगा। साथ ही, मेरा मानना ​​है कि फ्लोटिंग पॉइंट नंबरों की प्रकृति के कारण फ्लोट कुछ ऑपरेटर (उदा। ==, <,>) के लिए खतरनाक हो सकता है, और जब आवश्यक हो तो int को फ्लोट में परिवर्तित कर दिया जाएगा। इसलिए जब संभव हो मैं int में रहने के लिए संख्या पसंद करते हैं। एक बड़ी बात नहीं, सिर्फ खुद के लिए एक तरह का सम्मेलन के रूप में।

+1

[पाइथन - पर्स स्ट्रिंग टू फ्लोट या इंट] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/379906/python-parse-string-to-float-or-int) – Johnsyweb

+0

डुप्लिकेट नहीं; वह सवाल कुछ अलग पूछता है। –

+1

उदाहरण देने के लिए अपना प्रश्न संपादित करें जो यह स्पष्ट करता है कि "संभव होने पर संख्याएं int int" से आपका क्या मतलब है। विशेष रूप से, क्या आप "10.0000" (जहां उपयोगकर्ता का इरादा स्पष्ट रूप से फ्लोट होता है) को 'int' या 'float' में परिवर्तित किया जाता है। –

उत्तर

21
def int_or_float(s): 
    try: 
     return int(s) 
    except ValueError: 
     return float(s) 

आप चाहते हैं "10.0000" की तरह कुछ int करने के लिए परिवर्तित करते हैं, तो यह प्रयास करें:

def int_dammit_else_float(s): 
    f = float(s) 
    i = int(f) 
    return i if i == f else f 

क्या परिणाम आप "1e25" तरह इनपुट के लिए करना चाहते हैं?

+0

वाह मुझे मूर्खतापूर्ण महसूस हुआ जब मुझे एहसास हुआ कि आपका पहला समाधान वही करता है जो मैं चाहता था। मैं गलत समझ के तहत काम कर रहा था कि int ('1.1') int (1.1) करता है 1 से 1 तक होगा। उत्तर के लिए धन्यवाद और मेरी गलत धारणा को सही करने में मेरी सहायता करें। – KobeJohn

2

यह एक ऐसा समय है जहां माफी मांगने के पहले पहले अनुमति प्राप्त करना बेहतर होता है जिसे आमतौर पर चीजों को करने के लिए 'पायथनिक' तरीका माना जाता है और आमतौर पर try/except शामिल होता है। तो कुछ इस तरह सरल काफी अच्छा हो सकता है:

import re 
pattern = re.compile(r'[.eE]') 
v = float(s) if pattern.findall(s) else int(s) 
:

v = float(s) if '.' in s or 'e' in s.lower() else int(s) 

एक से अधिक चरित्र है कि एक चल बिन्दु संख्या का संकेत कर सकते हैं के बाद से, आप भी उनमें से एक इन निम्नलिखित अन्य तरीकों के लिए जांच कर सकता है

या

chars = set('.eE') 
v = float(s) if any((c in chars) for c in s) else int(s) 

अन्त में, एक अलग ट्रैक पर, आप चल चाहते थे बिंदु संपूर्ण संख्या पूर्णांक बनने के लिए, आप निम्न में से @ जॉन एम के समान है कर सकता है अचिन की '_dammit_ "समारोह:

v = int(float(s)) if int(float(s)) == float(s) else float(s) 
+0

केवल अगर आप सब कुछ जानते हैं जो आपको पूछना चाहिए; "1E-6" –

+0

@ जॉन मशीनिन: सामान्य रूप से अच्छा बिंदु, लेकिन यहां शायद अभी भी प्रबंधनीय (मेरा अपडेट देखें) आज़माएं। – martineau

+0

कोड मार्टिनौ के लिए धन्यवाद। यह मेरी ज़रूरतों के लिए बहुत अच्छा काम करेगा और मेरे पास जो कुछ भी था उसे सरल बनाता है। मैं वास्तव में ई नोटेशन छोड़ दूंगा क्योंकि एक बार जब आप मामलों को संभालने शुरू कर देते हैं, तो मुझे लगता है कि सभी मामलों को पकड़ने के लिए नियमित अभिव्यक्ति का उपयोग करना बेहतर होगा। – KobeJohn

2

eval (रों)

eval() एक समारोह है कि एक स्ट्रिंग स्वीकार करता है और अजगर कोड के रूप में यह संसाधित करता है। जब किसी स्ट्रिंग के रूप में किसी भी प्रकार का शाब्दिक दिया जाता है, तो वह उस मान वाले पायथन ऑब्जेक्ट को वापस कर देगा।

हालांकि, सुरक्षा दृष्टिकोण से, यह एक बुरा विचार है, क्योंकि कोई संभावित रूप से उन निर्देशों को खिला सकता है जो आपके प्रोग्राम के साथ दुर्घटनाग्रस्त हो जाते हैं या छेड़छाड़ करते हैं। आप इसे, हालांकि आवश्यक बना सकते हैं प्रसंस्करण से पहले पात्रों में से एक निश्चित निर्धारित, यानी .:

eval(s) if not set(s).difference('.') else None 

यह अभी भी होने के लिए शायद सिरदर्द के लायक नहीं है। उस ने कहा, आप फैंसी प्राप्त कर सकते हैं, और अभिव्यक्तियों को गणना के साथ भी अनुमति दे सकते हैं ... और यह कोशिश करने लायक हो सकता है! ऊपर किसी भी वस्तु से पारित कर दिया के लिए पूर्णांक वापसी या रूपांतरण या कोई नहीं तैर सकती है

num = lambda s: eval(s) if not set(s).difference('. *+-/e') else None 

>>> num('10') 
10 
>>> num('10.0') 
10.0 
>>> num('1e3') 
1000.0 
>>> num('4.8 * 10**34') 
4.8e+34 
>>> num('1+2/3') 
1.6666666666666665 
2
def int_float_none(x): 
    # it may be already int or float 
    if isinstance(x, (int, float)): 
     return x 
    # all int like strings can be converted to float so int tries first 
    try: 
     return int(x) 
    except (TypeError, ValueError): 
     pass 
    try: 
     return float(x) 
    except (TypeError, ValueError): 
     return None 

समारोह।

संबंधित मुद्दे

 संबंधित मुद्दे