¿Hay alguna forma de convertir el true
tipo unicode
a 1 y el false
tipo unicode
a 0 (en Python)?
Por ejemplo: x == 'true' and type(x) == unicode
quiero x = 1
PD: no quiero usar if
- else
.
Usar int()
en una prueba booleana:
x = int(x == 'true')
int()
convierte el booleano en 1
o 0
. Tenga en cuenta que cualquier valor que no sea igual a 'true'
resultará en 0
ser devuelto.
str
.u'true' == 'true'
la función se comporta correctamente independientemente del tipo de entrada [entrestr
yunicode
].u'true' == 'true'
y que no sabemos cuál es el caso de uso. Quizás quieran un comportamiento diferente para la situación en la quetype(x) != unicode
.arrayvalue == 'true'
comparación, la pregunta que respondí aquí es específica de un valor de cadena (Unicode).Si
B
es una matriz booleana, escriba(Un código de bits golfy).
fuente
numpy.multiply(B,1)
funciona.B=map(int,B)
devolvió un objeto de mapa en Python 3.Puede usar
x.astype('uint8')
dóndex
está su matriz booleana.fuente
Aquí hay otra solución más a su problema:
Funciona porque la suma de los códigos ASCII de
'true'
es448
, que es par, mientras que la suma de los códigos ASCII de'false'
es523
que es impar.Lo curioso de esta solución es que su resultado es bastante aleatorio si la entrada no es una de
'true'
o'false'
. La mitad de las veces volverá0
y la otra mitad1
. La variante que usaencode
generará un error de codificación si la entrada no es ASCII (aumentando así la indefinición del comportamiento).En serio, creo que la solución más fácil de leer y más rápida es usar un
if
:Vea algunos microbenchmarks:
Observe cómo la
if
solución es al menos 2,5 veces más rápida que todas las demás soluciones. No , no tiene sentido poner como requisito para evitar el uso deif
s, excepto si se trata de algún tipo de tarea (en cuyo caso no debería haber hecho esta en el primer lugar).fuente
Si necesita una conversión de propósito general de una cadena que per se no es un bool, es mejor que escriba una rutina similar a la que se muestra a continuación. De acuerdo con el espíritu de la escritura pato, no pasé el error silenciosamente, sino que lo convertí según corresponda para el escenario actual.
fuente
TypeError
? Si la cadena no contiene'true'
o'false'
es un error de valor . Si la entrada no es una cadena, obtendrá (99,99% de las veces) unAttributeError
en su lugar, por lo que es inútil buscarloValueError
y volver a subirlo comoTypeError
.index
generar un AttributeError?return ['false', 'true'].index(s) except (ValueError, AttributeError)
.lower()
llamada, ya que esta era la única solución que hacía este cálculo adicional y no habría sido correcto incluirla en el micro-benchmark. Claro que inclusotry...except
tomará un poco de tiempo, pero la diferencia es pequeña si no se plantea ninguna excepción (como20ns
menos o así).bool a int:
x = (x == 'true') + 0
Ahora la x contiene 1 si
x == 'true'
más 0.Nota:
x == 'true'
devolverá bool, que luego se convertirá en int que tiene valor (1 si el valor bool es True en caso contrario 0) cuando se agregue con 0.fuente
solo con esto:
const a = verdadero; const b = falso;
console.log (+ a); // 1 console.log (+ b); // 0
fuente