पायथन में एक स्ट्रिंग से बूलियन में परिवर्तित?


745

क्या कोई जानता है कि पायथन में एक स्ट्रिंग से एक बूलियन में कैसे परिवर्तित किया जाए? मुझे यह लिंक मिला । लेकिन यह इसे करने के लिए एक उचित तरीके की तरह नहीं दिखता है। निर्मित कार्यक्षमता, आदि का उपयोग करते हुए

इसका कारण मैं यह पूछ रहा हूं क्योंकि मैंने int("string")यहां से सीखा है। लेकिन जब bool("string")यह कोशिश करता है तो हमेशा लौटता है True:

>>> bool("False")
True

2
मैंने इसके लिए एक माइक्रो-लाइब्रेरी बनाई है जिसमें पोलिश के लिए कुछ विदेशी शब्द जैसे "टेक" भी शामिल हैं, मंदारिन-चीनी में "'Mandarin" ट्रू का मूल्यांकन करेंगे । यदि स्पष्ट रूप से सत्य नहीं है तो ईश मिथ्या का मूल्यांकन करेगा । सुझावों का स्वागत है। Github लिंक: github.com/kmonsoor/str2bool
kmonsoor

18
पहिया को सुदृढ़ करने के बजाय और कोड का एक गुच्छा लिखें जिसे आपको कार्गो पंथ के चारों ओर करना है, @ jzwener का जवाब पायथन मानक पुस्तकालय से एक फ़ंक्शनdistutils.util.strtobool(some_string) का उपयोग करता है । तकनीकी रूप से आउटपुट intवैल्यू 0या 1-> के साथ टाइप होता है, अगर आप वास्तव में चाहते हैं / जरूरत है boolतो आप उस फंक्शन को रैप कर सकते हैं bool(distutils.util.strtobool(some_string))
ट्रेवर बॉयड स्मिथ

1
पाइप स्थापित str2bool
Symon

बिलकुल चौकन्ना। distutils.util.strtobool@kmonsoor द्वारा समाधान के विपरीत, विदेशी हां / नहीं संभाल सकते हैं, जो हालांकि विदेशी भाषा में True / गलत के साथ Excel द्वारा बनाई गई CSV फ़ाइलों (जैसे VERO, FALSO) को संभाल नहीं सकते हैं । तो कभी-कभी पहिया-सुदृढीकरण की आवश्यकता होती है।
मट्टियो फेरला

जवाबों:


837

वास्तव में, आप स्ट्रिंग की तुलना केवल उस चीज़ से करते हैं जो आप सच का प्रतिनिधित्व करने के रूप में स्वीकार करने की अपेक्षा करते हैं, इसलिए आप ऐसा कर सकते हैं:

s == 'True'

या मूल्यों के एक पूरे समूह के खिलाफ जांच करने के लिए:

s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

निम्नलिखित का उपयोग करते समय सतर्क रहें:

>>> bool("foo")
True
>>> bool("")
False

खाली तार मूल्यांकन करते हैं False, लेकिन बाकी सब कुछ का मूल्यांकन करता है True। तो यह किसी भी तरह के पार्सिंग उद्देश्यों के लिए उपयोग नहीं किया जाना चाहिए।


48
+1: इससे अधिक सरल नहीं हो सकता s == "True"। लेकिन मैंने देखा है कि लोग इसके बारे में वास्तविक गड़बड़ करते हैं। def कन्वर्ट (s): अगर s == "ट्रू": ट्रू रिटर्न; विवरण झूठा है।
एस.लॉट

24
मैं रिटर्न पसंद करता हूं == "सच" अगर / और
दाना

26
अगर s == "ट्रू": रिटर्न ट्रू एलिफ s == "गलत": रिटर्न फाल्स: रिटर्न बढ़ा
अज्ञात

9
बूलियन्स को पार्सिंग स्ट्रिंग्स पहले से ही
डिस्टुटिल्स

9
मुझे पता है कि यह वास्तव में एक पुराना विषय है, लेकिन मैं यह जानना चाहता था कि मैंने अपने कोड को डिबग करने के लिए सिर्फ 4 घंटे बिताए हैं। मेरी गलती कास्ट करने की कोशिश कर रहा था bool("False")। यह हमेशा के लिए डाली जाएगी True
ईव।

304

उपयोग:

bool(distutils.util.strtobool(some_string))

सच्चे मूल्य y, हां, t, सत्य, चालू और 1 हैं; गलत मान n, no, f, false, off और 0. वैल्यू है। यदि वैल्यू कुछ और है।

ध्यान रखें कि distutils.util.strtobool()पूर्णांक निरूपण लौटाता है और इस प्रकार इसे bool()बूलियन मान प्राप्त करने के लिए लपेटना पड़ता है।


38
दुर्भाग्य से यह रिटर्न 1/ 0नहीं True/ False, इसलिए आपको वास्तविक बूलियन प्राप्त करने के लिए बूल () में परिणाम को लपेटने की आवश्यकता है:bool(distutils.util.strtobool(some_string))
Mariusz Jamro

2
वह कार्य तांत्रिक है। अगर यह पूर्णांकों संभाला और यह सही होगा Noneऔर str(None)इनपुट के रूप में।
MarkHu

20
मैं इसे उच्च मतदान वाले उत्तर के लिए पसंद करता हूं ... यह stdlib से है और वास्तव में इसकी आवश्यकता है। आम तौर पर / के boolबजाय एक वास्तविक की आवश्यकता के लिए कोई कारण नहीं है 1/ 0जब तक आप खराब सामान नहीं कर रहे हैं जैसे if x == False... और यदि आप intएस और Noneएस के साथ काम कर रहे हैं तो आपको एक विशेष फ़ंक्शन की आवश्यकता नहीं है, आप बस उन्हें जांच सकते हैं सीधे if myint:याif not maybe_none_var:
एंथ्रोपिक

4
@ सेकेटर boolउप-वर्ग हैint
एन्ट्रोपिक

1
किसी को त्रुटियों के Googling को बचाने के लिए: distutils आयात करें और distutils.util को इस काम के लिए आयात करें।
एडवर्ड बी

267
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

फिर इसे कॉल करें:

>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False

सही और गलत तरीके से निपटना:

आप अपने फ़ंक्शन को स्पष्ट रूप से शब्दों की सच्ची सूची और शब्दों की झूठी सूची के खिलाफ जांच कर सकते हैं। फिर अगर यह न तो सूची में है, तो आप एक अपवाद फेंक सकते हैं।


29
थोड़ा संवर्द्धन v.lower () के बजाय str (v) .lower () का उपयोग करके किया जा सकता है । फिर, यह काम कर सकता है यहां तक ​​कि यह स्ट्रिंग नहीं है, उदाहरण के लिए 1, 0
kmonsoor

पुन: स्पष्ट रूप से / गलत तरीके से हैंडल करते हुए, यदि स्ट्रिंग मेल नहीं खा रही है, तो आप एक डिफ़ॉल्ट मान भी प्रदान कर सकते हैं, जैसे कि कितना सच / गलत कमांड-लाइन प्रॉम्प्ट काम करता है: जारी रखें? (y / N)
जॉनस

113

JSON पार्सर सामान्य रूप से परिवर्तित होने वाले तारों के लिए भी उचित अजगर प्रकारों के लिए उपयोगी है।

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True

31
ध्यान दें कि यह विधि केवल तभी काम करती है जब यह निचला हो। यदि यह अपरकेस है, तो आप नहीं कर सकते। आपको कॉल करना होगा.lower()
CppLearner

107

पायथन 2.6 के साथ शुरू, वहाँ अब है ast.literal_eval:

>>> आयात ast
>>> मदद (ast.literal_eval)
मॉड्यूल में फ़ंक्शन शाब्दिक_लव पर मदद करें ast:

literal_eval (node_or_string)
    सुरक्षित रूप से एक अभिव्यक्ति नोड या एक पायथन युक्त स्ट्रिंग का मूल्यांकन करें
    अभिव्यक्ति। प्रदान की गई स्ट्रिंग या नोड में केवल निम्नलिखित शामिल हो सकते हैं
    पायथन शाब्दिक संरचनाएँ: तार, संख्याएँ, टुपल्स, सूचियाँ, डाइक, बूलियन,
    और कोई नहीं।

जब तक आपको लगता है कि आपके स्ट्रिंग्स "True"या तो होने जा रहे हैं, तो यह काम करने लगता है "False":

>>> ast.literal_eval ("सत्य")
सच
>>> ast.literal_eval ("गलत")
असत्य
>>> ast.literal_eval ("एफ")
ट्रेसबैक (सबसे हालिया कॉल अंतिम):
  फ़ाइल "", पंक्ति 1, में 
  फ़ाइल "/opt/Python-2.6.1/lib/python2.6/ast.py", पंक्ति 68, शाब्दिक_में
    वापसी _convert (node_or_string)
  फ़ाइल "/opt/Python-2.6.1/lib/python2.6/ast.py", पंक्ति 67, _ में
    ValueRrror बढ़ाएँ ('विकृत स्ट्रिंग')
ValueError: विकृत स्ट्रिंग
>>> ast.literal_eval ("'गलत'")
'असत्य'

मैं आमतौर पर इसकी अनुशंसा नहीं करता, लेकिन यह पूरी तरह से अंतर्निहित है और आपकी आवश्यकताओं के आधार पर सही बात हो सकती है।


1
इस समाधान की सामान्य प्रयोज्यता के बारे में निश्चित नहीं है, लेकिन यह एक सामान्य प्रकार में बहुत अच्छा है। +1!
सिंगलएनजेशन इलिमिनेशन

3
गाह, यह भयावह है! फिर, यदि आप था कहते हैं कि तुम इसकी सलाह नहीं देते, और यह करता है बड़े करीने से सवाल का जवाब। अच्छा खोजो!
वैनेसा फिप्स

4
दुर्भाग्य से यह इस मामले को नहीं संभालता है >>> ast.literal_eval ('सही') या ast.literal_eval ('TRUE') उठाता है >>> ValueError ('विकृत स्ट्रिंग') को बढ़ाएं, यह ठीक है हालांकि ast.literal_eval (to_test) .title ())
भूषण

इस विशेष प्रश्न का एक महान समाधान नहीं है, लेकिन ... वाह, शाब्दिक_प्रकार उपयोगी है! स्ट्रिंग की सूची में, तानाशाह, ect के।
ट्रैक्ट ऑक्ट

क्या यह यूनिकोड पर काम करता है? मेरे Django के दृश्य में मेरे पास एक आवक मूल्य है जिसे मैं बूलियन में बदलना चाहता हूं, यह एक विकृत स्ट्रिंग अपवाद दे रहा है।
प्रखर मोहन श्रीवास्तव

48

यदि आप जानते हैं कि स्ट्रिंग "True"या तो होगी "False", या आप बस उपयोग कर सकते हैं eval(s)

>>> eval("True")
True
>>> eval("False")
False

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


5
वह तार कहीं से आएगा। if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
nurettin

4
@nurettin, इसलिए यदि आप स्ट्रिंग की सामग्री के बारे में सुनिश्चित हैं तो इसका उपयोग करने के बारे में मेरी टिप्पणी।
जोएल क्रोटेउ

17

यह संस्करण कंस्ट्रक्टरों के शब्दार्थ को इंट (मान) की तरह रखता है और स्वीकार्य स्ट्रिंग मानों को परिभाषित करने का एक आसान तरीका प्रदान करता है।

def to_bool(value):
    valid = {'true': True, 't': True, '1': True,
             'false': False, 'f': False, '0': False,
             }   

    if isinstance(value, bool):
        return value

    if not isinstance(value, basestring):
        raise ValueError('invalid literal for boolean. Not a string.')

    lower_value = value.lower()
    if lower_value in valid:
        return valid[lower_value]
    else:
        raise ValueError('invalid literal for boolean: "%s"' % value)


# Test cases
assert to_bool('true'), '"true" is True' 
assert to_bool('True'), '"True" is True' 
assert to_bool('TRue'), '"TRue" is True' 
assert to_bool('TRUE'), '"TRUE" is True' 
assert to_bool('T'), '"T" is True' 
assert to_bool('t'), '"t" is True' 
assert to_bool('1'), '"1" is True' 
assert to_bool(True), 'True is True' 
assert to_bool(u'true'), 'unicode "true" is True'

assert to_bool('false') is False, '"false" is False' 
assert to_bool('False') is False, '"False" is False' 
assert to_bool('FAlse') is False, '"FAlse" is False' 
assert to_bool('FALSE') is False, '"FALSE" is False' 
assert to_bool('F') is False, '"F" is False' 
assert to_bool('f') is False, '"f" is False' 
assert to_bool('0') is False, '"0" is False' 
assert to_bool(False) is False, 'False is False'
assert to_bool(u'false') is False, 'unicode "false" is False'

# Expect ValueError to be raised for invalid parameter...
try:
    to_bool('')
    to_bool(12)
    to_bool([])
    to_bool('yes')
    to_bool('FOObar')
except ValueError, e:
    pass

3
Nit: आपका अंतिम "परीक्षण मामला" पहली कॉल पर त्रुटि करेगा और दूसरों का परीक्षण नहीं करेगा। साथ ही, यदि कोई त्रुटि नहीं उठाई जाती है तो वह विफल नहीं होगी ।
अगुरार

12

यहाँ मेरा संस्करण है। यह दोनों सकारात्मक और नकारात्मक मूल्यों की सूची के खिलाफ जांच करता है, अज्ञात मूल्यों के लिए एक अपवाद को बढ़ाता है। और यह एक स्ट्रिंग प्राप्त नहीं करता है, लेकिन किसी भी प्रकार को करना चाहिए।

def to_bool(value):
    """
       Converts 'something' to boolean. Raises exception for invalid formats
           Possible True  values: 1, True, "1", "TRue", "yes", "y", "t"
           Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
    """
    if str(value).lower() in ("yes", "y", "true",  "t", "1"): return True
    if str(value).lower() in ("no",  "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
    raise Exception('Invalid value for boolean conversion: ' + str(value))

नमूना चलता है:

>>> to_bool(True)
True
>>> to_bool("tRUe")
True
>>> to_bool("1")
True
>>> to_bool(1)
True
>>> to_bool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: 2
>>> to_bool([])
False
>>> to_bool({})
False
>>> to_bool(None)
False
>>> to_bool("Wasssaaaaa")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: Wasssaaaaa
>>>

इससे कोई भी काट सकता है: to_bool(["hello"])जिसे पूरी तरह से वैध कॉल होना चाहिए, अगर []उसका समर्थन किया जाए
राफेल टी

1
रिटर्न "अपवाद: बूलियन रूपांतरण के लिए अमान्य मान: ['हैलो']", जो अपेक्षित और प्रलेखित है। मेरी राय में एक खाली सूची स्पष्ट रूप से एक झूठी थी, लेकिन ['झूठी'] स्पष्ट रूप से कुछ भी नहीं थी, इसलिए मैंने इसे जानबूझकर छोड़ दिया - यह एक बग नहीं है। यदि आप चाहते हैं कि गैर-रिक्त सूचियों के लिए सही लौटने के लिए समर्थन जोड़ना आसान होना चाहिए।
पेत्रुकियो

1
shure आपने इसे प्रलेखित किया। लेकिन असली जियो में कभी कोई फोन नहीं करेगा to_bool([])। इसके बजाय वह इन पंक्तियों के साथ कुछ करेगा: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... one तो एक सूची है और जानना चाहते हैं कि क्या यह सूची कोई नहीं है या खाली है।
राफेल टी

यह क्यों नहीं आज़माया गया: >>> a2b (arg) को हराया: ... डिफ़ॉल्ट = बूल (arg) ... यदि आइंस्टीन (arg, str): ... ['true' में arg.lower () लौटाएँ, ' t ',' yes ',' y ',' 1 '] ... और: ... डिफ़ॉल्ट रूप से लौटें
ThePracticalOne

5
मामूली बिंदु: आपको शायद एक सादे अपवाद पर ValueError पसंद करना चाहिए ।
dshepherd

10

आप हमेशा कुछ ऐसा कर सकते हैं

myString = "false"
val = (myString == "true")

Parens में बिट झूठी का मूल्यांकन करेगा। यह एक वास्तविक कार्य कॉल करने के बिना करने के लिए सिर्फ एक और तरीका है।


1
क्या है val = "false"इस उदाहरण पर क्या कर रही लाइन? ऐसा क्यों है? इसका क्या मतलब है?
S.Lott

9
मुझे लगता है कि इसका मतलब 42 है।
जियो

@Geo: मैं सहमत हूँ; लेकिन उस प्रश्न का उत्तर उस कथन से क्या दिया गया था?
S.Lott

यह वही है जो मैं देख रहा था, एक फ़ाइल से इनपुट फ़ील्ड का मूल्यांकन करना और एक बूलियन भंडारण के परिणाम के आधार पर। धन्यवाद।
जिम्ह

9

एक शांत, सरल ट्रिक (जो @Alan Marchiori पोस्ट की गई है उसके आधार पर), लेकिन yaml का उपयोग करते हुए:

import yaml

parsed = yaml.load("true")
print bool(parsed)

यदि यह बहुत चौड़ा है, तो इसके प्रकार के परिणाम का परीक्षण करके इसे परिष्कृत किया जा सकता है। यदि yaml- लौटा हुआ प्रकार एक str है, तो इसे किसी अन्य प्रकार में नहीं डाला जा सकता है (जैसा कि मैं वैसे भी सोच सकता हूं), इसलिए आप इसे अलग से संभाल सकते हैं, या बस इसे सच होने दें।

मैं किसी भी गति का अनुमान नहीं लगाऊंगा, लेकिन चूंकि मैं क्यूटी गुई के तहत यमल डेटा के साथ काम कर रहा हूं, इसलिए यह एक अच्छी सहानुभूति है।


1
yamlमॉड्यूल एक तीसरी पार्टी पुस्तकालय है: PyYAML
पीटर लकड़ी

8

मैं यहां किसी भी समाधान से सहमत नहीं हूं, क्योंकि वे बहुत अधिक अनुमति वाले हैं। यह आम तौर पर नहीं है कि आप एक स्ट्रिंग को पार्स करते समय क्या चाहते हैं।

तो यहाँ मैं जो समाधान उपयोग कर रहा हूँ:

def to_bool(bool_str):
    """Parse the string and return the boolean value encoded or raise an exception"""
    if isinstance(bool_str, basestring) and bool_str: 
        if bool_str.lower() in ['true', 't', '1']: return True
        elif bool_str.lower() in ['false', 'f', '0']: return False

    #if here we couldn't parse it
    raise ValueError("%s is no recognized as a boolean value" % bool_str)

और परिणाम:

>>> [to_bool(v) for v in ['true','t','1','F','FALSE','0']]
[True, True, True, False, False, False]
>>> to_bool("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in to_bool
ValueError: '' is no recognized as a boolean value

बस स्पष्ट होना चाहिए क्योंकि ऐसा लगता है जैसे मेरे जवाब ने किसी को किसी तरह से नाराज कर दिया:

मुद्दा यह है कि आप केवल एक मान के लिए परीक्षण नहीं करना चाहते हैं और दूसरे को मान लेते हैं। मुझे नहीं लगता कि आप हमेशा गैर-पार्स किए गए मान के लिए बिल्कुल सब कुछ मैप करना चाहते हैं। यह त्रुटि प्रवण कोड पैदा करता है।

तो, यदि आप जानते हैं कि आप इसे कोड में क्या चाहते हैं।


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

8
@ मैं इससे असहमत हूं। बिंदु प्रश्न का उत्तर दे रहा है जैसा कि पूछा गया है।
एस्टानी

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

2
@dshepherd आइंस्टीन यह सुनिश्चित करने के लिए है कि मैं उम्मीद कर रहा हूं कि मैं क्या कर रहा हूं। मैं स्ट्रिंग्स पार्स कर रहा हूं इसलिए एक तरीका car_race.lower () है कि संयोग से '1' सही नहीं लौटना चाहिए, इसे एक ValueError फेंकना चाहिए। लेकिन यह अन्य मामलों में पर्याप्त हो सकता है।
एस्टानी

2
@CivFan दिलचस्प बिंदु। हालाँकि मैंने इसकी कोशिश की, और यह इतना अच्छा नहीं लगा (मुझे)। elifरिटर्न शब्द के कारण निरर्थक है, लेकिन यह आपको स्कैन किए बिना अधिक जानकारी देता है return। लेकिन यह केवल मेरे लिए है, अगर वहाँ एक पीईपी शैली का उल्लंघन है, तो मैं इसे बदलूंगा। किसी भी अन्य बाधा के बिना, हमें हमेशा पठनीयता के लिए जाना चाहिए (और मानक ऐसा करते हैं)। सिर के लिए धन्यवाद और दिलचस्प टिप्पणी!
इस्टानी

7

एक तानाशाही (वास्तव में, एक डिफ़ॉल्ट) आपको इस चाल को करने का एक बहुत आसान तरीका देता है:

from collections import defaultdict
bool_mapping = defaultdict(bool) # Will give you False for non-found values
for val in ['True', 'yes', ...]:
    bool_mapping[val] = True

print(bool_mapping['True']) # True
print(bool_mapping['kitten']) # False

इस पद्धति को वास्तव में आपके द्वारा इच्छित रूपांतरण रूपांतरण व्यवहार में लाना आसान है - आप इसे अनुमत सत्य और झूठे मूल्यों से भर सकते हैं और इसे एक अपवाद (या कोई नहीं लौटाते) तब बढ़ा सकते हैं जब कोई मूल्य नहीं मिलता है, या सही पर डिफ़ॉल्ट होता है, या गलत के लिए डिफ़ॉल्ट, या आप जो भी चाहते हैं।


5

आपके पास शायद पहले से ही एक समाधान है, लेकिन दूसरों के लिए, जो "मानक" झूठे मूल्यों सहित किसी भी मूल्य पर एक बूलियन मूल्य में परिवर्तित करने के लिए एक विधि की तलाश कर रहे हैं, [], {}, और "" के अलावा गलत, नहीं, और 0 ।

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems

1
सेट का उपयोग करना बेहतर है, not inऔर झूठी वस्तुओं का आपका चयन कुछ हद तक मूर्खतापूर्ण है।
साइलेंटगॉस्ट

5

आप बस अंतर्निहित फ़ंक्शन eval () का उपयोग कर सकते हैं :

a='True'
if a is True:
    print 'a is True, a type is', type(a)
else:
    print "a isn't True, a type is", type(a)
b = eval(a)
if b is True:
    print 'b is True, b type is', type(b)
else:
    print "b isn't True, b type is", type(b)

और आउटपुट:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>

1
यह केवल तभी काम करता है जब परीक्षण किए गए मान मान्य अजगर हैं। "सत्य" और "असत्य" एक अपवाद को बढ़ाएंगे।
गॉर्डन बीन

13
इसके अलावा, पार्सिंग के लिए 'ईवैल' का उपयोग करना वास्तव में एक बुरी आदत है क्योंकि इंगल स्ट्रिंग में मनमाना कोड चलाएगा। कुछ स्थितियों में यह पूरी तरह से एक बड़ी सुरक्षा पेश कर सकता है।
क्रिस्टोफर नाई

7
यह वास्तव में बुरा जवाब है। एक बूलियन पार्स करने के लिए एक मनमाना अभिव्यक्ति का मूल्यांकन करना एक अच्छा दृष्टिकोण नहीं है।
अगुरार

5

फिर भी एक और विकल्प

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

लेकिन उत्पादन में अगर आपको जरूरतमंद और उसके सभी आश्रितों की जरूरत नहीं है, तो एक अच्छा विचार यह है कि आप इसके स्रोत कोड को देखें और उस तर्क के हिस्से को कॉपी करें जिसकी आपको जरूरत है।


4

एक bool करने के लिए कास्टिंग के लिए सामान्य नियम यह है कि कुछ विशेष शाब्दिक ( False, 0, 0.0, (), [], {}) झूठे और फिर सब कुछ, सच है तो मैं निम्नलिखित की सिफारिश कर रहे हैं:

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)

3

यह वह संस्करण है जो मैंने लिखा था। अन्य समाधानों में से कई को एक में जोड़ता है।

def to_bool(value):
    """
    Converts 'something' to boolean. Raises exception if it gets a string it doesn't handle.
    Case is ignored for strings. These string values are handled:
      True: 'True', "1", "TRue", "yes", "y", "t"
      False: "", "0", "faLse", "no", "n", "f"
    Non-string values are passed to bool.
    """
    if type(value) == type(''):
        if value.lower() in ("yes", "y", "true",  "t", "1"):
            return True
        if value.lower() in ("no",  "n", "false", "f", "0", ""):
            return False
        raise Exception('Invalid value for boolean conversion: ' + value)
    return bool(value)

यदि इसे एक स्ट्रिंग मिलती है तो यह विशिष्ट मूल्यों की अपेक्षा करता है, अन्यथा एक अपवाद उठाता है। यदि यह एक स्ट्रिंग नहीं मिलता है, तो बस बूल कंस्ट्रक्टर इसका पता लगाने देता है। इन मामलों का परीक्षण:

test_cases = [
    ('true', True),
    ('t', True),
    ('yes', True),
    ('y', True),
    ('1', True),
    ('false', False),
    ('f', False),
    ('no', False),
    ('n', False),
    ('0', False),
    ('', False),
    (1, True),
    (0, False),
    (1.0, True),
    (0.0, False),
    ([], False),
    ({}, False),
    ((), False),
    ([1], True),
    ({1:2}, True),
    ((1,), True),
    (None, False),
    (object(), True),
    ]

के strबजाय का उपयोग करेंtype('')
19

3

यदि आप जानते हैं कि आपका इनपुट या तो "ट्रू" या "गलत" होगा, तो इसका उपयोग क्यों न करें:

def bool_convert(s):
    return s == "True"

आपको वास्तव में if s else Falseबिट की आवश्यकता नहीं है । इस बारे में सोचें कि "False" == "True"पहले से ही कैसे लौटेगा False
टेलर एड्मिस्टन

यदि आप अनिश्चित हैं कि इनपुट s एक स्ट्रिंग है या पहले से ही बूलियन है, तो आप जोड़ सकते हैं if type(s) is bool: return s
kontur

3

मैं उपयोग करता हूं

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""

2

मैं इसके लिए टर्नरी ऑपरेटर का उपयोग करना पसंद करता हूं, क्योंकि यह किसी चीज के लिए थोड़ा अधिक रसीला है जो महसूस करता है कि इसे 1 पंक्ति से अधिक नहीं होना चाहिए।

True if myString=="True" else False

1
My_string == 'True' की तुलना में यह अधिक रसीला कैसे है?
एस डी मेलो

2

मुझे लगता है कि यह एक पुरानी पोस्ट है, लेकिन कुछ समाधानों के लिए काफी कोड की आवश्यकता होती है, यहां मैंने जो प्रयोग किया है वह समाप्त हो गया है:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

7
यह कार्यात्मक रूप से इसके बराबर है, और इससे अधिक जटिल है: ('ट्रू', 'ट्रू') में रिटर्न वैल्यू
कीथ गौघन


1

यदि आप मुझे पसंद करते हैं तो बस चर से बूलियन की आवश्यकता है जो स्ट्रिंग है। आप पहले बताए अनुसार डिस्टिल्स का उपयोग कर सकते हैं @jzwiener। हालाँकि, मैं मॉड्यूल का आयात और उपयोग नहीं कर सका जैसा उसने सुझाव दिया था।

इसके बजाय मैं इसे python3.7 पर इस तरह से समाप्त करता हूं

डिस्टिल्स स्ट्रिंग टू बूल इन पाइथन

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distyils python std lib का हिस्सा है, इसलिए स्थापना की कोई आवश्यकता नहीं है। जो माहान है! 👍


1

मैं अपना सरल समाधान साझा करना चाहूंगा: का उपयोग करें eval()। यह स्ट्रिंग Trueऔर Falseउचित बूलियन प्रकार में परिवर्तित करेगा यदि स्ट्रिंग बिल्कुल शीर्षक प्रारूप में है Trueया Falseहमेशा पहला अक्षर कैपिटल है या फिर फ़ंक्शन एक त्रुटि उठाएगा।

जैसे

>>> eval('False')
False

>>> eval('True')
True

बेशक गतिशील चर के लिए आप .title()बूलियन स्ट्रिंग को प्रारूपित करने के लिए सरल उपयोग कर सकते हैं ।

>>> x = 'true'
>>> eval(x.title())
True

यह एक त्रुटि फेंक देगा।

>>> eval('true')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined

0

यहाँ एक बालों को, उसी तरह के कई उत्तर प्राप्त करने के लिए बनाया गया है। ध्यान दें कि हालांकि अजगर ""झूठे और अन्य सभी तार को सही मानता है, लेकिन टीसीएल चीजों के बारे में बहुत अलग विचार रखता है।

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> var = Tkinter.BooleanVar(tk)
>>> var.set("false")
>>> var.get()
False
>>> var.set("1")
>>> var.get()
True
>>> var.set("[exec 'rm -r /']")
>>> var.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 324, in get
    return self._tk.getboolean(self._tk.globalgetvar(self._name))
_tkinter.TclError: 0expected boolean value but got "[exec 'rm -r /']"
>>> 

इसके बारे में एक अच्छी बात यह है कि यह उन मूल्यों के बारे में काफी क्षमा है जो आप उपयोग कर सकते हैं। यह स्ट्रिंग को मूल्यों में बदलने के बारे में आलसी है, और यह इस बारे में स्वभाविक है कि यह क्या स्वीकार करता है और खारिज करता है (ध्यान दें कि यदि उपरोक्त कथन एक tcl प्रॉम्प्ट पर दिया गया था, तो यह उपयोगकर्ताओं को हार्ड डिस्क मिटा देगा)।

बुरी बात यह है कि इसके लिए यह आवश्यक है कि टिंकर उपलब्ध हो, जो कि आमतौर पर होता है, लेकिन सार्वभौमिक रूप से सच नहीं है, और अधिक महत्वपूर्ण रूप से, इसके लिए आवश्यक है कि एक Tk उदाहरण बनाया जाए, जो तुलनात्मक रूप से भारी हो।

क्या सही या गलत माना जाता है के व्यवहार पर निर्भर करता है Tcl_GetBoolean, जो मानता है 0, false, noऔर offझूठे हो सकता है और करने के लिए 1, true, yesऔर onसच है, केस संवेदी होने के लिए। खाली स्ट्रिंग सहित कोई अन्य स्ट्रिंग अपवाद का कारण बनती है।


0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

विचार: जांचें कि क्या आप चाहते हैं कि स्ट्रिंग का मूल्यांकन गलत तरीके से किया जाए; अन्यथा बूल () किसी भी गैर-रिक्त स्ट्रिंग के लिए सही है।


0

एक स्ट्रिंग की सत्यता का मूल्यांकन करने के लिए मैंने एक साथ कुछ फेंका है:

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

अधिक-या-कम एक ही परिणाम का उपयोग करते हुए evalसुरक्षित है।


0

मुझे बस यही करना था ... इसलिए पार्टी के लिए देर हो सकती है - लेकिन किसी को यह उपयोगी लग सकता है

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default

0

आपको लगता है कि लौटा रहा है इकाई पर नियंत्रण है, तो true/ false, एक ही विकल्प इसे वापस करने के लिए है 1/ 0के बजाय true/ falseहै, तो:

boolean_response = bool(int(response))

intएक नेटवर्क से प्रतिक्रियाओं को संभालने के लिए अतिरिक्त कलाकारों , जो हमेशा स्ट्रिंग होते हैं।


-5

पायथन के अंतर्निहित eval()फ़ंक्शन और .capitalize()विधि का उपयोग करके , आप किसी भी "सच्चे" / "झूठे" स्ट्रिंग (प्रारंभिक पूंजीकरण की परवाह किए बिना) को एक सच्चे पायथन बूलियन में बदल सकते हैं।

उदाहरण के लिए:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>

4
क्या होता है, अगर स्ट्रिंग शामिल है #\nshutil.rmtree('/someImportantDirectory')? (इसे आजमाएँ नहीं!)
मस्तोव

@ मस्तोव - हास्यास्पद डाउनवोट। जाहिर है अगर आपके पास आने वाली स्ट्रिंग का नियंत्रण नहीं है, तो आपको सावधानी बरतने की ज़रूरत है, जैसा कि आप किसी भी कोड के साथ करेंगे। लेकिन अगर आप वर्कफ़्लो को नियंत्रित करते हैं, तो यह एक सरल समाधान है जो काम करता है। एक ऐसे समाधान को भ्रमित न करें जो बुरे उत्तर के साथ हर तरह से सही नहीं है।
इलास्टैस्टर

1
खतरों का उल्लेख नहीं करने के अलावा (जो पहले से ही यह एक बुरा जवाब है): आप पहले से इनपुट को मंजूरी देने का प्रस्ताव कर रहे हैं? यह इस विधि की सादगी को मारने वाला है, जो इसका मुख्य प्लस था।
मस्तोव

4
का उपयोग करते हुए evalकुछ करने के लिए इस सरल अभी है पूछ एक जोखिम के लिए।
मस्तोव

1
सभी कोड नहीं। लेकिन विशेष रूप से कोड जो स्ट्रिंग को अन्य प्रकारों में परिवर्तित करता है, आमतौर पर आपके नियंत्रण से बाहर होता है । अक्सर आपको इसका एहसास भी नहीं होता होगा। आप कह सकते हैं: "यह मेरा डेटाबेस (या कॉन्फ़िग फ़ाइल) है, यह मेरे नियंत्रण में मेरे सिस्टम का हिस्सा है।" फिर आप डेटाबेस को कुछ अन्य मॉड्यूल एक्सेस देते हैं क्योंकि: "क्या नुकसान है? यह केवल कुछ तालिकाओं के साथ तार है।" लेकिन evalउन तार के साथ किसी को पूरे सिस्टम को संभालने में मदद मिल सकती है।
मस्तोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.