Existe uma maneira de converter true
do tipo unicode
em 1 e false
do tipo unicode
em 0 (em Python)?
Por exemplo: x == 'true' and type(x) == unicode
eu quero x = 1
PS: Não quero usar if
- else
.
Existe uma maneira de converter true
do tipo unicode
em 1 e false
do tipo unicode
em 0 (em Python)?
Por exemplo: x == 'true' and type(x) == unicode
eu quero x = 1
PS: Não quero usar if
- else
.
Respostas:
Use int()
em um teste booleano:
x = int(x == 'true')
int()
transforma o booleano em 1
ou 0
. Note-se que qualquer valor não igual a 'true'
irá resultar em 0
que estão sendo devolvidos.
str
.
u'true' == 'true'
, a função se comporta corretamente independentemente do tipo de entrada [entre str
e unicode
].
u'true' == 'true'
e não sabemos qual é o caso de uso. Talvez eles queiram um comportamento diferente para a situação em que type(x) != unicode
.
arrayvalue == 'true'
comparação, a pergunta que respondi aqui é específica para um valor de string (Unicode).
Se B
for uma matriz booleana, escreva
B = B*1
(Um código de bits)
numpy.multiply(B,1)
obras.
B=map(int,B)
retornaram um objeto de mapa em python 3 para mim.
Aqui está outra solução para o seu problema:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Ele funciona porque a soma dos códigos ASCII de 'true'
é 448
, o que é ainda, enquanto a soma dos códigos ASCII de 'false'
é 523
que é estranho.
O engraçado sobre esta solução é que seu resultado é bastante aleatório se a entrada não for um 'true'
ou 'false'
. Metade das vezes ele vai voltar 0
e a outra metade 1
. A variante usando encode
gerará um erro de codificação se a entrada não for ASCII (aumentando assim a indefinição do comportamento).
Sério, acredito que a solução mais legível e rápida é usar um if
:
def to_bool(s):
return 1 if s == 'true' else 0
Veja alguns microbenchmarks:
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
Observe como a if
solução é pelo menos 2,5x vezes mais rápido do que todos as outras soluções. Ele não faz sentido colocar como um requisito para evitar o uso de if
s exceto se isso é algum tipo de lição de casa (caso em que você não deveria ter perguntado isso em primeiro lugar).
Se você precisar de uma conversão de propósito geral de uma string que per se não é um bool, é melhor escrever uma rotina semelhante à descrita abaixo. Mantendo o espírito da digitação de pato, não passei o erro silenciosamente, mas o converti como apropriado para o cenário atual.
>>> 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
? Se a string não contém 'true'
ou 'false'
é um erro de valor . Se a entrada não for uma string, você obterá (99,99% das vezes) um an AttributeError
, portanto, é inútil capturá ValueError
-la e aumentá-la novamente como TypeError
.
index
gerar um AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
chamada, pois essa era a única solução que fazia esse cálculo extra e não seria correto incluí-la no micro-benchmark. Claro, mesmo isso try...except
leva um pouco de tempo, mas a diferença é pequena se nenhuma exceção for levantada (como 20ns
menos ou menos).
apenas com isso:
const a = verdadeiro; const b = falso;
console.log (+ a); // 1 console.log (+ b); // 0