Есть ли способ преобразовать 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
возвращено.
str
.
u'true' == 'true'
функция ведет себя правильно независимо от типа ввода [между str
и unicode
].
u'true' == 'true'
что мы не знаем, каков вариант использования. Может быть, они хотят другого поведения в той ситуации, когда type(x) != unicode
.
arrayvalue == 'true'
сравнения, вопрос, на который я здесь ответил, относится к строковому (unicode) значению.
Если B
это логический массив, напишите
B = B*1
(Немного кода гольфиста.)
numpy.multiply(B,1)
работает.
B=map(int,B)
мне вернули объект карты в python 3.
Вот еще одно решение вашей проблемы:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Это работает , потому что сумма ASCII кодов 'true'
IS 448
, что даже, в то время как сумма ASCII кодов 'false'
IS , 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
S , за исключением , если это какое - то домашний (в этом случае вы не должны были спросить это в первую очередь).
Если вам нужно универсальное преобразование из строки, которая сама по себе не является логическим значением, вам лучше написать процедуру, аналогичную изображенной ниже. Следуя духу утиной печати, я не пропустил ошибку молча, а преобразовал ее в соответствии с текущим сценарием.
>>> 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
TypeError
? Если строка не содержит 'true'
или 'false'
это ошибка значения . Если ввод не является строкой, вы получите (в 99,99% случаев) AttributeError
вместо этого, поэтому бесполезно ловить ValueError
и повторно поднимать его как TypeError
.
index
AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
вызов, поскольку это было единственное решение, которое выполняло эти дополнительные вычисления, и было бы неправильно включать его в микротест. Конечно, это try...except
займет немного времени, но разница небольшая, если исключение не возникает (например, 20ns
меньше или около того).
только с этим:
const a = true; const b = false;
console.log (+ a); // 1 console.log (+ b); // 0