¿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
.
¿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
.
Respuestas:
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 [entre str
y unicode
].
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 que type(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
B = B*1
(Un código de bits golfy).
numpy.multiply(B,1)
funciona.
B=map(int,B)
devolvió un objeto de mapa en Python 3.
Aquí hay otra solución más a su problema:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Funciona porque la suma de los códigos ASCII de 'true'
es 448
, que es par, mientras que la suma de los códigos ASCII de 'false'
es 523
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 mitad 1
. La variante que usa encode
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
:
def to_bool(s):
return 1 if s == 'true' else 0
Vea algunos 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 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 de if
s, excepto si se trata de algún tipo de tarea (en cuyo caso no debería haber hecho esta en el primer lugar).
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.
>>> 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
? 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) un AttributeError
en su lugar, por lo que es inútil buscarlo ValueError
y volver a subirlo como TypeError
.
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 incluso try...except
tomará un poco de tiempo, pero la diferencia es pequeña si no se plantea ninguna excepción (como 20ns
menos o así).
solo con esto:
const a = verdadero; const b = falso;
console.log (+ a); // 1 console.log (+ b); // 0