Подтвердить что ты не робот

Как преобразовать ‘false в 0 и‘ true в 1 в Python

Есть ли способ преобразовать true типа unicode в 1 и false типа unicode в 0 (в Python)?

Например: x == 'true' and type(x) == unicode

Я хочу x = 1

PS: я не хочу использовать if - else.

4b9b3361

Ответ 1

Используйте int() для логического теста:

x = int(x == 'true')

int() превращает логическое значение в 1 или 0. Обратите внимание, что любое значение не, равное 'true', приведет к возврату 0.

Ответ 2

Если B является логическим массивом, напишите

B = B*1

(немного кода игры в гольф.)

Ответ 3

Если вам требуется преобразование общего назначения из строки, которая сама по себе не является 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

Ответ 4

Вот еще одно решение вашей проблемы:

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, за исключением случаев, когда это какая-то домашняя работа (в этом случае вы не должны были спрашивать об этом в первую очередь).

Ответ 5

Вы можете использовать x.astype('uint8'), где x - ваш логический массив.

Ответ 6

Я использую для преобразования 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

Ответ 7

bool to int: x = (x == 'true') + 0

Теперь x содержит 1, если x == 'true' else 0.

Примечание: x == 'true' возвращает bool, который затем будет присваиваться методу int, имеющему значение (1, если значение bool равно True else 0) при добавлении с 0.

Ответ 8

Вы также можете использовать strtobool:

In [1]: import distutils

In [2]: distutils.util.strtobool("false")
Out[2]: 0

In [3]: distutils.util.strtobool("true")
Out[3]: 1

Ответ 9

Я использую:

>>> str(bool(0))
'False'

>>> str(bool(1))
'True'