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



есть ли способ, чтобы преобразовать true типа unicode 1 и false типа unicode до 0 (в python)?



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



Я хочу x = 1



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

621   10  

10 ответов:

использовать int() на логическом тесте:

x = int(x == 'true')

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

супер просто:

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

B=B*1

Это мой обычный трюк.

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

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

вы также можете использовать 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

Я использую:

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

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

Comments

    Ничего не найдено.