C'è un modo per convertire il true
tipo unicode
in 1 e il false
tipo unicode
in 0 (in Python)?
Per esempio: x == 'true' and type(x) == unicode
Voglio x = 1
PS: non voglio usare if
- else
.
C'è un modo per convertire il true
tipo unicode
in 1 e il false
tipo unicode
in 0 (in Python)?
Per esempio: x == 'true' and type(x) == unicode
Voglio x = 1
PS: non voglio usare if
- else
.
Risposte:
Utilizzare int()
su un test booleano:
x = int(x == 'true')
int()
trasforma il valore booleano in 1
o 0
. Notare che qualsiasi valore diverso da 'true'
verrà 0
restituito.
str
.
u'true' == 'true'
quindi la funzione si comporta correttamente indipendentemente dal tipo di input [tra str
e unicode
].
u'true' == 'true'
e non sappiamo quale sia il caso d'uso. Forse vogliono un comportamento diverso per la situazione in cui type(x) != unicode
.
arrayvalue == 'true'
confronto, la domanda a cui ho risposto qui è specifica per un valore di stringa (unicode).
Se B
è un array booleano, scrivi
B = B*1
(Un po 'di codice golfy.)
numpy.multiply(B,1)
opere.
B=map(int,B)
restituito un oggetto mappa in Python 3.
Ecco un'altra soluzione al tuo problema:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Funziona perché la somma dei codici ASCII di 'true'
IS 448
, che è ancora, mentre la somma dei codici ASCII di 'false'
IS 523
che è strano.
La cosa divertente di questa soluzione è che il suo risultato è abbastanza casuale se l'input non è uno di 'true'
o 'false'
. La metà delle volte tornerà 0
e l'altra metà 1
. La variante utilizzando encode
solleverà un errore di codifica se l'input non è ASCII (aumentando così l'indefinizione del comportamento).
Seriamente, credo che la soluzione più leggibile e veloce sia usare un if
:
def to_bool(s):
return 1 if s == 'true' else 0
Vedi alcuni microbenchmark:
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
Notare come la if
soluzione sia almeno 2,5 volte più veloce di tutte le altre soluzioni. Non ha senso mettere come requisito per evitare di usare if
s tranne se si tratta di una sorta di compito a casa (nel qual caso non avresti dovuto chiederlo in primo luogo).
Se hai bisogno di una conversione generica da una stringa che di per sé non è un bool, dovresti scrivere una routine simile a quella illustrata di seguito. In linea con lo spirito della dattilografia, non ho superato l'errore in silenzio, ma l'ho convertito in modo appropriato per lo scenario corrente.
>>> 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 la stringa non contiene 'true'
o 'false'
è un errore di valore . Se l'input non è una stringa, otterrai (99,99% delle volte) una stringa AttributeError
, quindi è inutile recuperarla ValueError
e rilanciarla come TypeError
.
index
innalzamento di un AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
chiamata poiché questa era l'unica soluzione che faceva questo calcolo extra e non sarebbe stato corretto includerla nel micro-benchmark. Certo anche ci try...except
vuole un po 'di tempo, ma la differenza è piccola se non viene sollevata alcuna eccezione (come 20ns
meno o giù di lì).
solo con questo:
const a = true; const b = falso;
console.log (+ a); // 1 console.log (+ b); // 0