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
.
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 [entrestr
eunicode
].u'true' == 'true'
e não sabemos qual é o caso de uso. Talvez eles queiram um comportamento diferente para a situação em quetype(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(Um código de bits)
fonte
numpy.multiply(B,1)
obras.B=map(int,B)
retornaram um objeto de mapa em python 3 para mim.Você pode usar
x.astype('uint8')
wherex
está o seu array booleano.fonte
Aqui está outra solução para o seu problema:
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 voltar0
e a outra metade1
. A variante usandoencode
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
:Veja alguns microbenchmarks:
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 deif
s exceto se isso é algum tipo de lição de casa (caso em que você não deveria ter perguntado isso em primeiro lugar).fonte
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.
fonte
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 anAttributeError
, portanto, é inútil capturáValueError
-la e aumentá-la novamente comoTypeError
.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 issotry...except
leva um pouco de tempo, mas a diferença é pequena se nenhuma exceção for levantada (como20ns
menos ou menos).bool para int:
x = (x == 'true') + 0
Agora, o x contém 1
x == 'true'
senão 0.Nota:
x == 'true'
retornará bool que então será convertido para int com valor (1 se o valor bool for True, caso contrário 0) quando adicionado com 0.fonte
apenas com isso:
const a = verdadeiro; const b = falso;
console.log (+ a); // 1 console.log (+ b); // 0
fonte