পাইথনের একটি স্ট্রিং থেকে বুলিয়ানে রূপান্তর করা হচ্ছে?


744

কেউ কি জানেন যে কীভাবে পাইথনের কোনও স্ট্রিং থেকে বুলেয়ানে রূপান্তর করতে হয়? আমি এই লিঙ্কটি খুঁজে পেয়েছি । এটি এটি করার মতো সঠিক পদ্ধতির মতো দেখায় না। অর্থাৎ অন্তর্নির্মিত কার্যকারিতা ইত্যাদি ব্যবহার করে

আমি এটি জিজ্ঞাসা করার কারণটি আমি এখান int("string")থেকে শিখেছি । তবে চেষ্টা করার bool("string")সময় সর্বদা ফিরে আসে True:

>>> bool("False")
True

2
আমি ঠিক এর জন্য একটি মাইক্রো-লাইব্রেরি তৈরি করেছি যাতে কিছু বিদেশী শব্দের অন্তর্ভুক্ত রয়েছে যেমন পোলিশের জন্য "টাক", ম্যান্ডারিন-চীনা ভাষায় ""।। " সত্য হিসাবে মূল্যায়ন করবে । স্পষ্টভাবে না হলে সত্য-ইশ মিথ্যাতে মূল্যায়ন করবে । পরামর্শ স্বাগত জানাই। গিথুব
kmonsoor

18
চাকাটি পুনরায় উদ্ভাবন করা এবং আপনার চারপাশে কার্গো কাল্টের কোডের একগুচ্ছ লেখার চেয়ে @ জাজউইনার এর উত্তরটি পাইথন স্ট্যান্ডার্ড লাইব্রেরি থেকে একটি ফাংশনdistutils.util.strtobool(some_string) ব্যবহার করে । টেকনিক্যালি আউটপুট প্রকার intমান 0বা 1-> যদি সত্যিই / প্রয়োজন চান boolতারপর আপনি যে ফাংশন মোড়ানো পারেন bool(distutils.util.strtobool(some_string))
ট্রেভর বয়েড স্মিথ


শুধু একটি মাথা আপ. distutils.util.strtobool@ কমসনুরের সমাধানের বিপরীতে বিদেশী হ্যাঁ / না, হ্যান্ডেল করতে পারে না, যা এক্সেল হ্যান্ডেল করতে পারে না বিদেশী ভাষায় সত্য (মিথ্যা) দিয়ে সিএসভি ফাইল তৈরি করে (যেমন VERO, FALSO)। তাই মাঝে মাঝে চাকা-পুনর্বিন্যাসের প্রয়োজন হয়।
মেটেও ফেরেলা

উত্তর:


836

সত্যই, আপনি সত্যটিকে প্রতিনিধিত্বকারী হিসাবে গ্রহণের প্রত্যাশার সাথে কেবল স্ট্রিংটির তুলনা করেছেন, তাই আপনি এটি করতে পারেন:

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 == "সত্য": সত্য ফিরে আসুন; প্রত্যাবর্তন মিথ্যা।
এস। লট

24
আমি যদি / অন্যটি
ডানা

26
যদি s == "সত্য": প্রত্যাবর্তন সত্য এলিফ s == "মিথ্যা": ফেরত অন্যথায়: প্রত্যাবর্তন উত্থাপন
অজানা

9
Booleans স্ট্রিং পার্সিং ইতিমধ্যে distutils.util.strtobool বাস্তবায়িত হয়: stackoverflow.com/a/18472142/923599
jzwiener

9
আমি জানি এটি একটি সত্যই পুরানো বিষয়, তবে আমি প্রমাণ করতে চেয়েছিলাম যে আমি আমার কোডটি ডিবাগ করার চেষ্টা করে মাত্র 4 ঘন্টা ব্যয় করেছি। আমার ভুল কাস্ট করার চেষ্টা করছিল bool("False")। এটি সর্বদা নিক্ষেপ করা হবে True
ইভ।

304

ব্যবহার করুন:

bool(distutils.util.strtobool(some_string))

সত্য মানগুলি হ্যাঁ, হ্যাঁ, টি, সত্য, অন এবং 1; ভ্যালু মানগুলি হ'ল এন, না, এফ, ভুয়া, অফ এবং 0.

সচেতন থাকুন যে distutils.util.strtobool()পূর্ণসংখ্যার উপস্থাপনা ফেরত দেয় এবং এভাবে bool()বুলিয়ান মানগুলি পেতে এটি মোড়ানো প্রয়োজন ।


38
দুর্ভাগ্যক্রমে এটি প্রত্যাবর্তন করে 1/ 0না True/ Falseতাই আপনার আসল বুলিয়ান পেতে bool(distutils.util.strtobool(some_string))
ফলাফলটি বুল

2
এই ফাংশন tantalizing হয়। যদি এটা পূর্ণসংখ্যার ঘাঁটা এবং এটা নিখুঁত হতে হবে Noneএবং str(None)ইনপুট হিসাবে।
মার্কহু

20
আমি এটিকে উচ্চতর ভোট দেওয়া উত্তরের চেয়ে বেশি পছন্দ করি ... এটি স্টাডলিব থেকে এবং এটি যা প্রয়োজন ঠিক তা করে। সাধারণত আপনি যতক্ষণ খারাপ জিনিস না করছেন boolতার পরিবর্তে 1/ সত্যের পরিবর্তে কোনও কারণ হওয়ার প্রয়োজন নেই ... এবং আপনি যদি এস এবং এস এর সাথে কাজ করে থাকেন তবে আপনার কোনও বিশেষ ক্রিয়াকলাপের প্রয়োজন নেই, আপনি কেবল সেগুলি পরীক্ষা করতে পারেন সরাসরি বা0if x == FalseintNoneif myint:if not maybe_none_var:
এ্যান্ট্রোপিক

4
@ সেক্টর boolহ'ল একটি উপ-শ্রেণিint
এ্যান্ট্রপিক

1
কাউকে কিছু গুগলিংয়ের ত্রুটিগুলি বাঁচাতে: এটিকে কাজ করার জন্য আমদানি করুন ডিস্টিলিটস এবং আমদানি করুন ডিস্টুয়েলস u
এডওয়ার্ড বি

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
, সামান্য বর্ধিতকরণ ব্যবহার করা যেতে পারে Str (উ) .lower () এর পরিবর্তে 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

পাইথন ২.6 দিয়ে শুরু করে এখন রয়েছে ast.literal_eval:

>>> আমদানি এসটি
>>> সহায়তা (ast.literal_eval)
মডিউল এস্টে আক্ষরিক_বেলা ফাংশনে সহায়তা করুন:

literal_eval (node_or_string)
    এক্সপ্রেশন নোড বা পাইথনযুক্ত স্ট্রিং নিরাপদে মূল্যায়ন করুন
    অভিব্যক্তি। সরবরাহ করা স্ট্রিং বা নোডে কেবলমাত্র নিম্নলিখিতটি থাকতে পারে
    পাইথন আক্ষরিক কাঠামো: স্ট্রিং, সংখ্যা, টিপলস, তালিকা, ডিক্টস, বুলিয়ানস,
    এবং কিছুই না।

যেটি কার্যকর বলে মনে হচ্ছে যতক্ষণ না আপনি নিশ্চিত যে আপনার স্ট্রিংগুলি হয় "True"বা "False":

>>> ast.literal_eval ("সত্য")
সত্য
>>> ast.literal_eval ("মিথ্যা")
মিথ্যা
>>> ast.literal_eval ("F")
ট্রেসব্যাক (সবচেয়ে সাম্প্রতিকতম কল সর্বশেষ):
  ফাইল "", লাইন 1, ইন 
  আক্ষরিক_প্রেমে ফাইল "/opt/Python-2.6.1/lib/python2.6/ast.py", লাইন 68
    প্রত্যাবর্তন _ কনভার্ট (নোড_অর_স্ট্রিং)
  কনভার্টে ফাইল "/opt/Python-2.6.1/lib/python2.6/ast.py", 67 লাইন
    মান উত্থাপন ('ত্রুটিযুক্ত স্ট্রিং')
মানমূল: ত্রুটিযুক্ত স্ট্রিং
>>> ast.literal_eval ("'মিথ্যা'")
'মিথ্যা'

আমি সাধারণত এটি সুপারিশ করব না, তবে এটি সম্পূর্ণ অন্তর্নির্মিত এবং আপনার প্রয়োজনীয়তার উপর নির্ভর করে সঠিক জিনিস হতে পারে।


1
এই সমাধানটির সাধারণ প্রয়োগযোগ্যতা সম্পর্কে নিশ্চিত নন, তবে এটি একটি সাধারণ পদ্ধতিতে খুব সুন্দর। +1 টি!
সিঙ্গেলএজিগেশন ইলিমিনেশন

3
গা, এটাই ভয়াবহ! তারপর আবার, আপনি হয়নি বলে আপনি এটা বলতে না, এবং এটি আছে সুন্দরভাবে প্রশ্নের উত্তর। গুড ফাইন্ড!
ভেনেসা ফিপস

4
দুর্ভাগ্যক্রমে এটি এই কেসটি হ্যান্ডেল করে না >>> ast.literal_eval ('true') বা ast.literal_eval ('TRU') উত্থাপন করে >>> মান বাড়ান ('ত্রুটিযুক্ত স্ট্রিং') ঠিকঠাক যদিও ast.literal_eval (to_test) .title ())
ভূষণ

এই নির্দিষ্ট প্রশ্নের একটি দুর্দান্ত সমাধান নয়, তবে ... বাহ, আক্ষরিক_মর্যাদামুক্তই কার্যকর! স্ট্রিং তালিকা, ডিক্ট, ect।
travc

এটি ইউনিকোড থেকে কাজ করে? আমার জ্যাঙ্গো ভিউতে আমার একটি আগত মান রয়েছে যা আমি বুলেয়ানে পরিবর্তন করতে চাই, এটি একটি ত্রুটিযুক্ত স্ট্রিং ব্যতিক্রম দিচ্ছে।
প্রখর মোহন শ্রীবাস্তব

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.
নুরেটিন

4
@ নুরেটিন, সুতরাং স্ট্রিংয়ের বিষয়বস্তু সম্পর্কে নিশ্চিত হয়ে থাকলে কেবল এটি ব্যবহার সম্পর্কে আমার মন্তব্য।
জোয়েল ক্রোটো

17

এই সংস্করণটি int (মান) এর মতো নির্মাতাদের শব্দার্থকে বজায় রাখে এবং গ্রহণযোগ্য স্ট্রিং মানগুলি সংজ্ঞায়িত করার একটি সহজ উপায় সরবরাহ করে।

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
নীট: আপনার শেষ "পরীক্ষার কেস" প্রথম কলটিতে ত্রুটিযুক্ত হবে এবং অন্যদের পরীক্ষা করবে না। এছাড়া, এটিও ব্যর্থ না যদি কোন ত্রুটি না উত্থাপিত।
7:30

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
"ব্যতিক্রম: বুলিয়ান রূপান্তরকরণের জন্য অবৈধ মান: ['হ্যালো']" প্রত্যাবর্তন করে, যা প্রত্যাশিত এবং নথিভুক্ত। আমার মতে একটি খালি তালিকা স্পষ্টতই একটি মিথ্যা ছিল, তবে ['মিথ্যা'] পরিষ্কার কিছু ছিল না, তাই আমি ইচ্ছাকৃতভাবে এটি ছেড়ে দিয়েছি - এটি একটি বৈশিষ্ট্য নয় এটি একটি বাগ not খালি শূন্য তালিকার জন্য সত্যটি ফিরিয়ে দেওয়ার জন্য সমর্থন যুক্ত করা সহজ হওয়া উচিত যদি এটি আপনি চান।
পেট্রুসিও

1
shure আপনি এটি নথিভুক্ত। কিন্তু বাস্তব লাইভে কেউ কখনও কল করতে পারে না to_bool([])। পরিবর্তে তিনি এই লাইনগুলি বরাবর কিছু করবেন: myList=someFunctionThatReturnAList`if (is_bool (মাইলিস্ট)): ... ´ সুতরাং একটির একটি তালিকা আছে এবং জানতে চান যে এই তালিকাটি কোনওটি খালি নয়।
রাফেল টি

কেন এটি চেষ্টা করবেন না: >>> ডিএফ এ 2 বি (আরজি): ... ডিফল্ট = বুল (আরগ) ... যদি আইসনস্ট্যান্স (আরগ, স্ট্র): ... ফিরে 'আরগ' ফ্লোর () এ 'সত্য', ' t ',' হ্যাঁ ',' y ',' 1 '] ... অন্যথায়: ... ডিফল্ট ফিরে আসুন
ফিরুন

5
গৌণ বিন্দু: আপনার সম্ভবত একটি সাধারণ ব্যতিক্রমের চেয়ে ভ্যালুআরারের পছন্দ হওয়া উচিত ।
রাখাল

10

আপনি সবসময় যেমন কিছু করতে পারে

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

প্যারেন্সের বিটটি মিথ্যাতে মূল্যায়ন করবে। আসল ফাংশন কল না করে এটি করার এটি অন্য একটি উপায়।


1
কি val = "false"এই উদাহরণে করছে লাইন? ওখানে কেন? এর মানে কী?
এস .লট

9
আমি মনে করি এটির অর্থ 42
জিও

@ জিও: আমি সম্মত; কিন্তু সেই বিবৃতি দিয়ে যে প্রশ্নের উত্তর দেওয়া হয়েছিল তা কী ছিল?
এস। লট

এটি ঠিক আমি যা খুঁজছিলাম, একটি ফাইল থেকে একটি ইনপুট ক্ষেত্র মূল্যায়ন করে এবং বুলিয়ান সংরক্ষণের ফলাফলের ভিত্তিতে। ধন্যবাদ.
jimh

9

একটি দুর্দান্ত, সাধারণ কৌশল (@ অ্যালান মার্চিয়েরি পোস্ট করেছেন তার উপর ভিত্তি করে), তবে ইয়ামল ব্যবহার করছেন:

import yaml

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

এটি যদি খুব প্রশস্ত হয় তবে প্রকারের ফলাফলটি পরীক্ষা করে এটি পরিমার্জন করা যায়। যদি ইয়ামল-ফেরত টাইপটি স্ট্র হয়, তবে এটি অন্য কোনও প্রকারে কাস্ট করা যাবে না (যা আমি যেভাবেই ভাবতে পারি), তাই আপনি এটি আলাদাভাবে পরিচালনা করতে পারেন, বা এটি সত্য হতে দিন।

আমি গতিতে কোনও অনুমান করব না, তবে যেহেতু আমি Qt gui এর অধীনে যমল ডেটা নিয়ে কাজ করছি, এটির একটি দুর্দান্ত প্রতিসাম্য রয়েছে।


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
@ কিথ আমি একমত নই বিষয়টি যেমন জিজ্ঞাসা করা হয়েছে তেমন উত্তর দিচ্ছে is
এস্তানি

1
প্রশ্নটি জিজ্ঞাসা করা হয়েছিল যে কীভাবে একটি স্ট্রিংকে বুলিয়ান রূপান্তর করতে হয়। এটাই আমি উত্তর দিয়েছিলাম। মূল পোস্টারটির জন্য বৈধ বুলিয়ান স্ট্রিং কী হিসাবে বিবেচিত হবে তা আমি জানি না এবং আপনিও করেন না। এজন্য পোস্টারটির পুরো উত্তর দেওয়ার চেয়ে সাধারণ নীতিটি প্রদর্শন করা আরও গুরুত্বপূর্ণ। মূল পোস্টারটি তাদের কাছে বানানযুক্ত সমস্ত কিছুর প্রয়োজন ছিল না: সাধারণ নীতিটি প্রদর্শনের জন্য তাদের যা প্রয়োজন তা ছিল। এটি থেকে, যোগ্য যে কেউ আপনার উত্তর পেতে পারে।
কিথ গাগান

2
@ শেফার্ড আইসনস্ট্যান্সটি নিশ্চিত আছে যে আমি যা প্রত্যাশা করছি তা পার্স করছি। আমি স্ট্রিংগুলি পার্স করছি সুতরাং একটি পদ্ধতি car_race.lower () যা সুযোগক্রমে '1' প্রত্যাবর্তন করে সত্যে ফিরে আসে না, এটি একটি মান মূল্য ফেলে দেয়। তবে এটি অন্যান্য ক্ষেত্রে যথেষ্ট হতে পারে।
এস্তানি

2
@ সিভিফ্যান আকর্ষণীয় পয়েন্ট। যদিও আমি চেষ্টা করেছিলাম, এবং এটি এত সুন্দর (আমার কাছে) পড়েনি। 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 এর সাথে ",", "," এবং "" ব্যতীত "মানক" ভুয়া মানগুলি ব্যবহার করে কোনও বুলিয়ান মানকে রূপান্তর করতে একটি পদ্ধতি খুঁজছেন for ।

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

আপনি কেবল অন্তর্নির্মিত ফাংশন ইয়াল () ব্যবহার করতে পারেন :

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
এটি একটি সত্যই খারাপ উত্তর। একটি বুলিয়ান পার্স করার জন্য একটি স্বেচ্ছাসেবী অভিব্যক্তি মূল্যায়ন একটি ভাল পদ্ধতির নয়।
7:30

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('')
পিপ্পারি

3

আপনি যদি জানেন যে আপনার ইনপুটটি "সত্য" বা "মিথ্যা" হবে তবে কেন ব্যবহার করবেন না:

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

আপনার আসলে if s else Falseবিটের দরকার নেই । কীভাবে "False" == "True"ইতিমধ্যে ফিরে আসবে সে সম্পর্কে ভাবুন False
টেলর এডমিস্টন

যদি আপনি অনিশ্চিত হন যে ইনপুটটি স্ট্রিং বা ইতিমধ্যে বুলিয়ান হয় তবে আপনি যুক্ত করতে পারেন if type(s) is bool: return s
কান্টুর

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
এটি আমার_ স্ট্রিং == 'সত্য' এর চেয়ে আরও কীভাবে সংহত?
এস ডি দে মেলো

2

আমি বুঝতে পারি এটি একটি পুরানো পোস্ট, তবে কয়েকটি সমাধানের জন্য বেশ কিছুটা কোডের প্রয়োজন হয়, এখানে আমি কী ব্যবহার করে শেষ করেছি:

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

7
এটি কার্যত সমান এবং এর চেয়ে জটিল: ফেরতের মান ('সত্য', 'সত্য')
কীথ গাগান


1

আপনি যদি আমার পছন্দ করেন তবে কেবল ভেরিয়েবলের বুলিয়ান দরকার যা স্ট্রিং। আপনি আগে @ jzwiener দ্বারা উল্লিখিত ডিস্টিলগুলি ব্যবহার করতে পারেন। তবে আমি তার পরামর্শ মতো মডিউলটি আমদানি ও ব্যবহার করতে পারিনি।

পরিবর্তে আমি পাইথন 3.7 এ এভাবে ব্যবহার করি

পাইথনের স্ট্রিংগুলিতে বুল যায়

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

ডিস্টুয়েলস পাইথন স্টাড লাইবের একটি অংশ তাই কোনও ইনস্টলেশন করার দরকার নেই। যা মহান! 👍


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_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
বিপদগুলি উল্লেখ না করা (যা ইতিমধ্যে এটি একটি খারাপ উত্তর করে তোলে): আপনি আগেই ইনপুটটি স্যানিটাইজ করার প্রস্তাব দিচ্ছেন? এটি এই পদ্ধতির সরলতাকে হত্যা করতে চলেছে, যা এটির প্রধান প্লাস।
mastov

4
evalএই সাধারণ কোনও কিছুর জন্য ব্যবহার করা কেবল দুর্বলতার জন্য জিজ্ঞাসা করা।
mastov

1
সমস্ত কোড নয়। কিন্তু বিশেষত কোডটি অন্যান্য ধরনের পরিবর্তিত স্ট্রিং সাধারণত হয় আপনার নিয়ন্ত্রণের বাইরে। প্রায়শই আপনি এটি বুঝতেও পারেন না। আপনি বলতে পারেন: "এটি আমার ডাটাবেস (বা কনফিগারেশন ফাইল), এটি আমার সিস্টেমের একটি অংশ, আমার নিয়ন্ত্রণে" " তারপরে আপনি একটি ডেটাবেজে অন্য কিছু মডিউল অ্যাক্সেস দিয়েছেন কারণ: "ক্ষতি কী? এটি কেবল স্ট্রিং সহ কয়েকটি টেবিল" " তবে evalএই স্ট্রিংগুলির সাহায্যে কাউকে পুরো সিস্টেমটি দখল করতে সহায়তা করতে পারে।
mastov
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.