Есть ли способ преобразовать true
типа unicode
в 1 и false
типа unicode
в 0 (в Python)?
Например: x == 'true' and type(x) == unicode
Я хочу x = 1
PS: я не хочу использовать if
- else
.
Есть ли способ преобразовать true
типа unicode
в 1 и false
типа unicode
в 0 (в Python)?
Например: x == 'true' and type(x) == unicode
Я хочу x = 1
PS: я не хочу использовать if
- else
.
Используйте int()
для логического теста:
x = int(x == 'true')
int()
превращает логическое значение в 1
или 0
. Обратите внимание, что любое значение не, равное 'true'
, приведет к возврату 0
.
Если B
является логическим массивом, напишите
B = B*1
(немного кода игры в гольф.)
Если вам требуется преобразование общего назначения из строки, которая сама по себе не является bool, лучше написать процедуру, аналогичную описанной ниже. В соответствии с духом утиного ввода, я не молча передал ошибку, но преобразовал ее в соответствии с текущим сценарием.
>>> 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 Python 3
Это работает, потому что сумма кодов 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 раза быстрее, чем все другие решения. Нет смысла ставить в качестве требования избегать использования if
, за исключением случаев, когда это какая-то домашняя работа (в этом случае вы не должны были спрашивать об этом в первую очередь).
Вы можете использовать x.astype('uint8')
, где x
- ваш логический массив.
Я использую для преобразования 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'
else 0.
Примечание: x == 'true'
возвращает bool, который затем будет присваиваться методу int, имеющему значение (1, если значение bool равно True else 0) при добавлении с 0.
Вы также можете использовать strtobool
:
In [1]: import distutils
In [2]: distutils.util.strtobool("false")
Out[2]: 0
In [3]: distutils.util.strtobool("true")
Out[3]: 1
Я использую:
>>> str(bool(0))
'False'
>>> str(bool(1))
'True'