Chuyển đổi từ một chuỗi thành boolean trong Python?


745

Có ai biết làm thế nào để chuyển đổi từ một chuỗi thành boolean trong Python không? Tôi tìm thấy liên kết này . Nhưng nó không giống như một cách thích hợp để làm điều đó. Tức là sử dụng chức năng tích hợp, v.v.

Lý do tôi hỏi điều này là vì tôi đã học được int("string")từ đây. Nhưng khi thử bool("string")nó luôn trả về True:

>>> bool("False")
True

2
tôi đã tạo ra một thư viện vi mô chỉ dành cho điều này bao gồm một số từ nước ngoài, ví dụ: "tak" cho tiếng Ba Lan, "'" trong tiếng Trung Quốc sẽ đánh giá là True . Nếu không rõ ràng đúng-ish sẽ đánh giá thành Sai . Đề nghị được chào đón. Liên kết Github: github.com/kmonsoor/str2bool
kmonsoor

18
Thay vì phát minh lại bánh xe và viết một loạt mã mà bạn phải tôn sùng hàng hóa, câu trả lời của @ jzwiener sử dụng một chức năng từ thư viện chuẩn pythondistutils.util.strtobool(some_string) . Về mặt kỹ thuật, đầu ra là loại intcó giá trị 0hoặc 1-> nếu bạn thực sự muốn / cần boolthì bạn có thể bọc hàm đó với bool(distutils.util.strtobool(some_string)).
Trevor Boyd Smith

1
Pip cài đặt str2bool
Symon

Chỉ cần một cái đầu lên. distutils.util.strtoboolkhông thể xử lý có ngoại / không, không giống như các giải pháp bởi @kmonsoor, mà tuy nhiên không thể xử lý Excel làm file CSV với True / False bằng tiếng nước ngoài (ví dụ VERO, FALSO). Vì vậy, việc tái cấu trúc bánh xe đôi khi được yêu cầu.
Matteo Ferla

Câu trả lời:


837

Thực sự, bạn chỉ cần so sánh chuỗi với bất cứ điều gì bạn muốn chấp nhận là đại diện đúng, vì vậy bạn có thể làm điều này:

s == 'True'

Hoặc để kiểm tra toàn bộ giá trị:

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

Hãy thận trọng khi sử dụng như sau:

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

Chuỗi rỗng đánh giá False, nhưng mọi thứ khác đánh giá True. Vì vậy, điều này không nên được sử dụng cho bất kỳ mục đích phân tích cú pháp.


48
+1: Không nhiều có thể đơn giản hơn s == "True". Nhưng tôi đã thấy mọi người tạo ra một mớ hỗn độn thực sự về điều này. def convert (s): if s == "True": return True; Trả về Sai.
S.Lott

24
Tôi thích trả về s == "True" hơn if / other
Dana

26
if s == "True": return True elif s == "Sai": return Sai khác: return return
Unknown

9
Phân tích chuỗi thành booleans đã được triển khai trong distutils.util.strtobool: stackoverflow.com/a/18472142/923599
jzwiener

9
Tôi biết đây là một chủ đề cũ THỰC SỰ, nhưng tôi muốn chứng thực rằng tôi vừa dành 4 giờ để gỡ lỗi mã của mình. Sai lầm của tôi là cố gắng để đúc bool("False"). Nó sẽ luôn luôn đúc True.
Ev.

304

Sử dụng:

bool(distutils.util.strtobool(some_string))

Giá trị đúng là y, yes, t, true, on và 1; giá trị sai là n, không, f, false, off và 0. Tăng ValueError nếu val là bất cứ thứ gì khác.

Xin lưu ý rằng distutils.util.strtobool()trả về các biểu diễn số nguyên và do đó nó cần được gói bool()lại để nhận các giá trị Boolean.


38
Thật không may, điều này trả về 1/ 0không True/ False, vì vậy bạn cần phải bọc kết quả trong bool () để có được boolean thực tế:bool(distutils.util.strtobool(some_string))
Mariusz Jamro

2
Chức năng đó là trêu ngươi. Nó sẽ là hoàn hảo nếu nó xử lý số nguyên Nonestr(None)như là đầu vào.
MarkHu

20
Tôi rất thích điều này với các câu trả lời được bình chọn cao hơn ... đó là từ stdlib và thực hiện chính xác những gì được yêu cầu. Nói chung không có lý do để cần một thực tế boolthay vì 1/ 0miễn là bạn không làm những việc xấu như if x == False... và nếu bạn đang làm việc với bạn intNonebạn không cần một chức năng đặc biệt, bạn chỉ cần kiểm tra chúng trực tiếp if myint:hoặcif not maybe_none_var:
Anentropic

4
@Secator boollà một lớp con củaint
Anentropic

2
Để cứu ai đó một số lỗi của Google: nhập distutils và nhập distutils.util để làm việc này.
Edward B.

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

Sau đó gọi nó như vậy:

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

Xử lý đúng và sai một cách rõ ràng:

Bạn cũng có thể làm cho chức năng của mình kiểm tra rõ ràng đối với một danh sách từ đúng và danh sách từ sai. Sau đó, nếu nó không có trong danh sách, bạn có thể ném một ngoại lệ.


29
tăng cường chút ít có thể được thực hiện bằng cách sử dụng, str (v) .lower () thay vì v.lower () . Sau đó, nó có thể hoạt động ngay cả khi nó không phải là chuỗi, ví dụ 1, 0
kmonsoor

RE: xử lý đúng / sai một cách rõ ràng, bạn cũng có thể cung cấp một giá trị mặc định nếu chuỗi không khớp, giống như cách nhắc nhở dòng lệnh đúng / sai: Tiếp tục? (y / N)
Johnus 3/03/2016

113

Trình phân tích cú pháp JSON cũng hữu ích trong việc chuyển đổi các chuỗi thành các kiểu python hợp lý.

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

31
Lưu ý phương pháp này chỉ hoạt động nếu nó là chữ thường. Nếu đó là chữ hoa, bạn không thể. Bạn phải gọi.lower()
CppLearner

107

Bắt đầu với Python 2.6, giờ đã có ast.literal_eval:

>>> nhập khẩu ast
>>> trợ giúp (ast.literal_eval)
Trợ giúp về chức năng lítal_eval trong mô-đun ast:

lítal_eval (node_or_opes)
    Đánh giá an toàn một nút biểu thức hoặc một chuỗi chứa Python
    biểu hiện. Chuỗi hoặc nút được cung cấp chỉ có thể bao gồm những điều sau đây
    Cấu trúc nghĩa đen của Python: chuỗi, số, bộ dữ liệu, danh sách, dicts, booleans,
    và Không có.

Điều này dường như hoạt động, miễn là bạn chắc chắn chuỗi của bạn sẽ là "True"hoặc "False":

>>> ast.literal_eval ("Đúng")
Thật
>>> ast.literal_eval ("Sai")
Sai
>>> ast.literal_eval ("F")
TracBack (cuộc gọi gần đây nhất vừa qua):
  Tệp "", dòng 1, trong 
  Tệp "/opt/Python-2.6.1/lib/python2.6/ast.py", dòng 68, bằng lítal_eval
    return _convert (node_or_opes)
  Tệp "/opt/Python-2.6.1/lib/python2.6/ast.py", dòng 67, trong _convert
    nâng cao ValueError ('chuỗi không đúng định dạng')
ValueError: chuỗi không đúng
>>> ast.literal_eval ("'Sai'")
'Sai'

Tôi thường không khuyến nghị điều này, nhưng nó hoàn toàn tích hợp và có thể là điều đúng tùy theo yêu cầu của bạn.


1
Không chắc chắn về khả năng áp dụng chung của giải pháp này, nhưng nó rất hay, theo một cách chung. +1!
SingleNegationElimination

3
Gaah, thật kinh khủng! Sau đó, một lần nữa, bạn đã nói rằng bạn không khuyên bạn nên nó, và nó không trả lời câu hỏi gọn gàng. Tìm tốt
Vanessa Phipps

4
Thật không may, nó không xử lý trường hợp này >>> ast.literal_eval ('true') hoặc ast.literal_eval ('TRUE') Tăng >>> nâng cao ValueError ('chuỗi không đúng') Cách khắc phục rất đơn giản mặc dù ast.literal_eval (to_test .title ())
Bhushan

Không phải là một giải pháp tuyệt vời cho câu hỏi đặc biệt này, nhưng ... Wow, lítal_eval rất hữu ích! Chuỗi để liệt kê, dict, ect.
travc

Nó hoạt động trên unicodes đến? Trong chế độ xem Django của tôi, tôi có một giá trị đến mà tôi muốn thay đổi thành boolean, nó đưa ra một ngoại lệ chuỗi không đúng.
Prakhar Mohan Srivastava

48

Nếu bạn biết chuỗi sẽ là "True"hoặc "False", bạn chỉ có thể sử dụng eval(s).

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

Chỉ sử dụng điều này nếu bạn chắc chắn về nội dung của chuỗi, vì nó sẽ đưa ra một ngoại lệ nếu chuỗi không chứa Python hợp lệ và cũng sẽ thực thi mã có trong chuỗi.


5
chuỗi đó sẽ đến từ một nơi nào đó. if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Nurettin

4
@nurettin, do đó nhận xét của tôi về việc chỉ sử dụng nó nếu bạn chắc chắn về nội dung của chuỗi.
Joel Croteau

17

Phiên bản này giữ ngữ nghĩa của các hàm tạo như int (value) và cung cấp một cách dễ dàng để xác định các giá trị chuỗi chấp nhận được.

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: "trường hợp thử nghiệm" cuối cùng của bạn sẽ báo lỗi trong cuộc gọi đầu tiên và không kiểm tra các cuộc gọi khác. Ngoài ra, nó sẽ không thất bại nếu một lỗi không được nêu ra.
tháng tám

12

Đây là phiên bản của tôi. Nó kiểm tra đối với cả danh sách giá trị dương và âm, đưa ra một ngoại lệ cho các giá trị không xác định. Và nó không nhận được một chuỗi, nhưng bất kỳ loại nào cũng nên làm.

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

Chạy mẫu:

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

Người ta có thể bị cắn bởi điều này: to_bool(["hello"])đó sẽ là một cuộc gọi hoàn toàn hợp lệ, nếu []được hỗ trợ
Rafael T

1
Trả về "Ngoại lệ: Giá trị không hợp lệ cho chuyển đổi boolean: ['hello']", được mong đợi và ghi lại. Theo tôi, một danh sách trống rõ ràng là sai, nhưng ['false'] rõ ràng không phải là bất cứ điều gì, vì vậy tôi đã cố tình bỏ nó đi - đó là một tính năng không phải là một lỗi. Nên dễ dàng thêm hỗ trợ để trả về true cho danh sách không trống nếu đó là điều bạn muốn.
Petrucio

1
Shure bạn đã ghi lại nó. Nhưng trong đời thực, người ta sẽ không bao giờ gọi to_bool([]). Thay vào đó, anh ta sẽ làm một cái gì đó dọc theo các dòng này: myList=someFunctionThatReturnAList`if (is_bool (myList)): ... ọ để một người có một danh sách và muốn biết danh sách này là Không hoặc trống.
Rafael T

Tại sao không thử điều này: >>> def a2b (arg): ... default = bool (arg) ... if isinstance (arg, str): ... return arg.lower () trong ['true', ' t ',' có ',' y ',' 1 '] ... khác: ... trả về mặc định
ThePracticalOne

5
Điểm nhỏ: có lẽ bạn nên thích ValueError hơn một Ngoại lệ đơn giản.
dshepherd

10

bạn luôn có thể làm một cái gì đó như

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

bit trong parens sẽ đánh giá thành Sai. Đây chỉ là một cách khác để làm điều đó mà không phải thực hiện một cuộc gọi chức năng thực tế.


1
Là gì val = "false"dòng làm trên ví dụ này? Tại sao nó ở đó? Nó có nghĩa là gì?
S.Lott

9
Tôi nghĩ nó có nghĩa là 42.
Geo

@Geo: Tôi đồng ý; Nhưng câu hỏi được trả lời bởi câu nói đó là gì?
S.Lott

đây chính xác là những gì tôi đang tìm kiếm, đánh giá một trường đầu vào từ một tệp và dựa trên kết quả lưu trữ một boolean. cảm ơn bạn.
jimh

9

Một mẹo đơn giản, thú vị (dựa trên những gì @Alan Marchiori đã đăng), nhưng sử dụng yaml:

import yaml

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

Nếu cái này quá rộng, nó có thể được tinh chỉnh bằng cách kiểm tra kết quả loại. Nếu loại trả về yaml là một str, thì nó không thể được chuyển sang bất kỳ loại nào khác (mà tôi có thể nghĩ ra bằng mọi cách), vì vậy bạn có thể xử lý riêng nó, hoặc chỉ để nó là sự thật.

Tôi sẽ không đoán được tốc độ, nhưng vì tôi đang làm việc với dữ liệu yaml theo Qt gui, nên điều này có tính đối xứng tốt.


1
Các yamlmô-đun là một thư viện của bên thứ ba: PyYAML
Peter Gỗ

8

Tôi không đồng ý với bất kỳ giải pháp nào ở đây, vì chúng quá dễ dãi. Đây không phải là những gì bạn muốn khi phân tích một chuỗi.

Vì vậy, đây là giải pháp tôi đang sử dụng:

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)

Và kết quả:

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

Chỉ cần rõ ràng bởi vì có vẻ như câu trả lời của tôi đã xúc phạm ai đó bằng cách nào đó:

Vấn đề là bạn không muốn chỉ kiểm tra một giá trị và giả sử giá trị kia. Tôi không nghĩ rằng bạn luôn muốn ánh xạ Tuyệt đối mọi thứ đến giá trị không được phân tích cú pháp. Điều đó tạo ra mã dễ bị lỗi.

Vì vậy, nếu bạn biết những gì bạn muốn mã nó trong.


2
Tôi nghĩ rằng bạn đang thiếu điểm: điểm của câu trả lời là thể hiện nguyên tắc chung, không nói cho người hỏi câu hỏi chính xác họ nên làm như thế nào. Người đặt câu hỏi ban đầu đã suy nghĩ về vấn đề thực sự đơn giản.
Keith Gaughan

8
@Keith tôi không đồng ý. Vấn đề là trả lời câu hỏi khi nó được hỏi.
estani

1
Câu hỏi được đặt ra là làm thế nào để chuyển đổi một chuỗi thành boolean. Đó là câu hỏi tôi đã trả lời. Tôi không biết cái gì được coi là chuỗi boolean hợp lệ cho poster gốc và bạn cũng vậy. Đó là lý do tại sao việc thể hiện nguyên tắc chung quan trọng hơn là đưa ra câu trả lời đầy đủ cho người đăng. Các poster ban đầu không cần mọi thứ được nêu ra cho họ: tất cả những gì họ cần là cho nguyên tắc chung được thể hiện. Từ đó, bất cứ ai có thẩm quyền sẽ nhận được câu trả lời của bạn.
Keith Gaughan

2
@dshepherd isinstance ở đó để chắc chắn rằng tôi đang phân tích cú pháp những gì tôi mong đợi. Tôi đang phân tích cú pháp chuỗi để phương thức car_race.lower () mà tình cờ trả về '1' không nên trả về true, nó sẽ ném ValueError. Nhưng nó có thể đủ trong các trường hợp khác.
estani

2
@CivFan điểm thú vị. Mặc dù tôi đã thử nó, và nó không đọc được tốt lắm (với tôi). eliflà dư thừa vì từ trả về, nhưng nó cung cấp cho bạn thêm thông tin mà không cần phải quét return. Nhưng đó chỉ là tôi, nếu có vi phạm kiểu PEP, tôi sẽ thay đổi nó. Không có bất kỳ ràng buộc nào khác, chúng ta nên luôn luôn tìm kiếm sự dễ đọc (và các tiêu chuẩn làm điều đó). Cảm ơn cho những người đứng đầu và nhận xét thú vị!
estani

7

Một dict (thực sự, một defaultdict) cung cấp cho bạn một cách khá dễ dàng để thực hiện thủ thuật này:

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

Thật dễ dàng để điều chỉnh phương thức này theo hành vi chuyển đổi chính xác mà bạn muốn - bạn có thể điền vào nó với các giá trị Truthy và Falsy được phép và để nó đưa ra một ngoại lệ (hoặc trả về Không) khi không tìm thấy giá trị hoặc mặc định là True, hoặc mặc định là Sai, hoặc bất cứ điều gì bạn muốn.


5

Có thể bạn đã có một giải pháp nhưng đối với những người khác đang tìm kiếm một phương thức để chuyển đổi một giá trị thành giá trị boolean bằng cách sử dụng các giá trị sai "tiêu chuẩn" bao gồm Không, [], {} và "" ngoài sai, không và 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
tốt hơn là sử dụng các bộ not invà lựa chọn của bạn về các mục sai là hơi đơn giản.
SilentGhost

5

Bạn chỉ có thể sử dụng hàm tích hợp 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)

và đầu ra:

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

1
Điều này chỉ hoạt động khi các giá trị được kiểm tra là python hợp lệ. "đúng" và "sai" sẽ đưa ra một ngoại lệ.
Gordon Bean

13
Hơn nữa, đó là một thói quen thực sự xấu khi sử dụng 'eval' để phân tích cú pháp vì eval sẽ chạy mã tùy ý trong chuỗi. Trong một số tình huống, điều này có thể trình bày một tổng thể an ninh rất lớn.
Christopher Barber

7
Đây là một câu trả lời thực sự xấu. Đánh giá một biểu thức tùy ý để phân tích cú pháp boolean KHÔNG phải là một cách tiếp cận tốt.
tháng tám

5

Một lựa chọn khác

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

Nhưng trong sản xuất nếu bạn không cần ansible và tất cả các phụ thuộc của nó, một ý tưởng tốt là xem xét mã nguồn của nó và sao chép một phần logic mà bạn cần.


4

Nguyên tắc thông thường cho đúc một bool là một vài chữ đặc biệt ( False, 0, 0.0, (), [], {}) là sai và sau đó mọi thứ khác là đúng, vì vậy tôi khuyên sau đây:

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

3

Đây là phiên bản tôi đã viết. Kết hợp một số giải pháp khác thành một.

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)

Nếu nó nhận được một chuỗi, nó mong đợi các giá trị cụ thể, nếu không sẽ tăng Ngoại lệ. Nếu nó không nhận được một chuỗi, chỉ cần cho phép hàm bool tìm ra nó. Đã kiểm tra những trường hợp này:

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),
    ]

Sử dụng strthay vìtype('')
pppery

3

Nếu bạn biết rằng đầu vào của bạn sẽ là "Đúng" hoặc "Sai" thì tại sao không sử dụng:

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

Bạn thực sự không cần if s else Falsebit. Hãy suy nghĩ về cách "False" == "True"sẽ trở lại False.
Taylor Edmiston

Nếu bạn không chắc chắn nếu s đầu vào là một chuỗi hoặc đã là boolean, bạn có thể thêm if type(s) is bool: return s.
kontur

3

tôi sử dụng

# 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

Tôi thích sử dụng toán tử ternary cho việc này, vì nó ngắn gọn hơn một chút cho thứ gì đó cảm thấy như nó không nên nhiều hơn 1 dòng.

True if myString=="True" else False

1
Làm thế nào nó ngắn gọn hơn my_opes == 'True'?
S. de Melo

2

Tôi nhận ra đây là một bài viết cũ, nhưng một số giải pháp yêu cầu khá nhiều mã, đây là những gì tôi đã sử dụng:

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

7
Điều đó có chức năng tương đương và phức tạp hơn: giá trị trả về trong ('Đúng', 'đúng')
Keith Gaughan


1

Nếu bạn thích tôi chỉ cần boolean từ biến đó là chuỗi. Bạn có thể sử dụng các bản dịch như đã đề cập trước đó bởi @jzwiener. Tuy nhiên tôi không thể nhập và sử dụng mô-đun như ông đề xuất.

Thay vào đó tôi kết thúc bằng cách này trên python3.7

chuỗi distutils để bool trong python

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

distutils là một phần của lib python std vì vậy không cần cài đặt. Thật là tuyệt! 👍


1

Tôi muốn chia sẻ giải pháp đơn giản của tôi: sử dụng eval() . Nó sẽ chuyển đổi chuỗi TrueFalsethành kiểu boolean thích hợp NẾU chuỗi đó chính xác ở định dạng tiêu đề TruehoặcFalse luôn luôn viết hoa chữ cái đầu tiên nếu không hàm sẽ gây ra lỗi.

ví dụ

>>> eval('False')
False

>>> eval('True')
True

Tất nhiên đối với biến động, bạn có thể sử dụng đơn giản .title() định dạng chuỗi boolean.

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

Điều này sẽ ném một lỗi.

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

Đây là một sợi lông, được xây dựng để có được nhiều câu trả lời giống nhau. Lưu ý rằng mặc dù python coi ""là sai và tất cả các chuỗi khác là đúng, TCL có một ý tưởng rất khác về mọi thứ.

>>> 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 /']"
>>> 

Một điều tốt về điều này là nó khá tha thứ về các giá trị bạn có thể sử dụng. Thật lười biếng trong việc biến các chuỗi thành các giá trị và nó bị biến đổi về những gì nó chấp nhận và từ chối (lưu ý rằng nếu tuyên bố trên được đưa ra tại một dấu nhắc tcl, nó sẽ xóa đĩa cứng của người dùng).

điều tồi tệ là nó yêu cầu Tkinter phải có sẵn, điều này thường, nhưng không phải là phổ biến, và quan trọng hơn, đòi hỏi phải tạo ra một cá thể Tk, tương đối nặng.

Những gì được coi là đúng hay sai phụ thuộc vào hành vi của các Tcl_GetBoolean, trong đó xem xét 0, false, noofflà sai lầm và 1, true, yesonđến mức khó tin, trường hợp không nhạy cảm. Bất kỳ chuỗi nào khác, bao gồm cả chuỗi trống, đều gây ra ngoại lệ.


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

ý tưởng: kiểm tra xem bạn có muốn đánh giá chuỗi thành Sai hay không; mặt khác bool () trả về True cho bất kỳ chuỗi không trống nào.


0

Đây là một cái gì đó tôi đã cùng nhau đánh giá tính trung thực của một chuỗi:

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)

ít nhiều kết quả giống như sử dụng evalnhưng an toàn hơn.


0

Tôi chỉ phải làm điều này ... vì vậy có thể đến bữa tiệc muộn - nhưng ai đó có thể thấy nó hữu ích

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

Nếu bạn có quyền kiểm soát thực thể trả về true/ false, một tùy chọn là trả lại 1/ 0thay vì true/ false, sau đó:

boolean_response = bool(int(response))

Dàn diễn viên phụ để intxử lý các phản hồi từ một mạng, luôn luôn là chuỗi.


-5

Bằng cách sử dụng eval()hàm dựng sẵn của Python và.capitalize() phương thức, bạn có thể chuyển đổi bất kỳ chuỗi "true" / "false" nào (bất kể viết hoa ban đầu) thành boolean Python thực sự.

Ví dụ:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

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

# OUTPUT: <type 'bool'>

4
Điều gì xảy ra, nếu chuỗi chứa #\nshutil.rmtree('/someImportantDirectory')? (Đừng thử!)
mastov

@mastov - downvote nực cười. Rõ ràng nếu bạn không có quyền kiểm soát chuỗi đến, bạn cần đặt các biện pháp phòng ngừa, giống như với bất kỳ mã nào. Nhưng nếu bạn kiểm soát quy trình làm việc, đây là một giải pháp đơn giản mà hiệu quả. Đừng nhầm lẫn một giải pháp không hoàn hảo theo mọi cách với một câu trả lời tồi.
elPastor

1
Ngoài việc không đề cập đến những nguy hiểm (điều này đã khiến điều này trở thành một câu trả lời tồi): Bạn đang đề xuất vệ sinh đầu vào trước? Điều đó sẽ giết chết sự đơn giản của phương pháp này, đó là điểm cộng chính của nó.
mastov

4
Sử dụng evalcho một cái gì đó đơn giản này chỉ là yêu cầu một lỗ hổng.
mastov

1
Không phải tất cả mã. Nhưng đặc biệt là mã chuyển đổi chuỗi thành các loại khác thường nằm ngoài tầm kiểm soát của bạn. Thường thì bạn có thể không nhận ra nó. Bạn có thể nói: "Đó là cơ sở dữ liệu của tôi (hoặc tệp cấu hình), nó là một phần của hệ thống của tôi, dưới sự kiểm soát của tôi." Sau đó, bạn cấp cho một số mô-đun khác quyền truy cập vào cơ sở dữ liệu vì: "Có hại gì không? Chỉ có một số bảng có chuỗi." Nhưng với evalnhững chuỗi đó có thể giúp ai đó tiếp quản toàn bộ hệ thống.
mastov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.