10 ответов:
использовать
int()на логическом тесте:x = int(x == 'true')
int()превращает логическое значение в1или0. Обратите внимание, что любое значение не равна'true'в результате0возвращается.
Если вам нужно преобразование общего назначения из строки, которая сама по себе не является bool, вам лучше написать процедуру, подобную описанной ниже. В соответствии с духом duck typing, я не молча передал ошибку, но преобразовал ее в соответствии с текущим сценарием.
>>> def str2bool(st): try: return ['false', 'true'].index(st.lower()) except (ValueError, AttributeError): raise ValueError('no Valid Conversion Possible') >>> str2bool('garbaze') Traceback (most recent call last): File "<pyshell#106>", line 1, in <module> str2bool('garbaze') File "<pyshell#105>", line 5, in str2bool raise TypeError('no Valid COnversion Possible') TypeError: no Valid Conversion Possible >>> str2bool('false') 0 >>> str2bool('True') 1
вот еще одно решение вашей проблемы:
def to_bool(s): return 1 - sum(map(ord, s)) % 2 # return 1 - sum(s.encode('ascii')) % 2 # alternative for python3это работает, потому что сумма кодов ASCII
'true'- это448, который является четным, в то время как сумма кодов ASCII'false'и523что странно.
самое смешное в этом решении то, что его результат довольно случайный, если вход не одним из
'true'или'false'. Половину времени он будет возвращаться0, а другая половина1. Вариант используяencodeвызовет ошибку кодирования, если вход не является ASCII (таким образом, увеличивая неопределенность поведения).
серьезно, я считаю самым читаемым,и быстрее, решение заключается в использовании
if:def to_bool(s): return 1 if s == 'true' else 0см. некоторые микробные метки:
In [14]: def most_readable(s): ...: return 1 if s == 'true' else 0 In [15]: def int_cast(s): ...: return int(s == 'true') In [16]: def str2bool(s): ...: try: ...: return ['false', 'true'].index(s) ...: except (ValueError, AttributeError): ...: raise ValueError() In [17]: def str2bool2(s): ...: try: ...: return ('false', 'true').index(s) ...: except (ValueError, AttributeError): ...: raise ValueError() In [18]: def to_bool(s): ...: return 1 - sum(s.encode('ascii')) % 2 In [19]: %timeit most_readable('true') 10000000 loops, best of 3: 112 ns per loop In [20]: %timeit most_readable('false') 10000000 loops, best of 3: 109 ns per loop In [21]: %timeit int_cast('true') 1000000 loops, best of 3: 259 ns per loop In [22]: %timeit int_cast('false') 1000000 loops, best of 3: 262 ns per loop In [23]: %timeit str2bool('true') 1000000 loops, best of 3: 343 ns per loop In [24]: %timeit str2bool('false') 1000000 loops, best of 3: 325 ns per loop In [25]: %timeit str2bool2('true') 1000000 loops, best of 3: 295 ns per loop In [26]: %timeit str2bool2('false') 1000000 loops, best of 3: 277 ns per loop In [27]: %timeit to_bool('true') 1000000 loops, best of 3: 607 ns per loop In [28]: %timeit to_bool('false') 1000000 loops, best of 3: 612 ns per loopобратите внимание, как
ifрешение по крайней мере 2.5 x времени быстрее чем все другой решения. Это делает не имеет смысл поставить в качестве требования, чтобы избежать использованияifs за исключением того, что это какая-то домашняя работа (в этом случае вы не должны были спрашивать об этом в первую очередь).
вы также можете использовать
strtobool:In [1]: import distutils In [2]: distutils.util.strtobool("false") Out[2]: 0 In [3]: distutils.util.strtobool("true") Out[3]: 1
Я использую для преобразования everywere в логическое целое число:
>>> x = 'I am a non-empty text' >>> int(bool(x)) 1 >>> x = '' # This is a empty text >>> int(bool(x)) 0 >>> x = True >>> int(bool(x)) 1 >>> x = False >>> int(bool(x)) 0
bool to int:
x = (x == 'true') + 0Теперь x содержит 1, если
x == 'true'0 в противном случае.Примечание:
x == 'true'вернет bool, который затем будет переведен в int, имеющий значение (1, если значение bool равно 0) при добавлении с 0.
# create identity 3x3 matrix with python list using list comprehension a = [[(i==j) for i in range(3)] for j in range(3)] print(a) [[True, False, False], [False, True, False], [False, False, True]] # now how to make true and false into 1 and 0 b = [[int(i==j) for i in range(3)] for j in range(3)] print(b) [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # Therefore, int(False) return 0 while int(True) returns 1
Comments