Existe-t-il un moyen de convertir le true
type unicode
en 1 et le false
type unicode
en 0 (en Python)?
Par exemple: x == 'true' and type(x) == unicode
Je voudrais x = 1
PS: je ne veux pas utiliser if
- else
.
Existe-t-il un moyen de convertir le true
type unicode
en 1 et le false
type unicode
en 0 (en Python)?
Par exemple: x == 'true' and type(x) == unicode
Je voudrais x = 1
PS: je ne veux pas utiliser if
- else
.
Réponses:
Utilisation int()
sur un test booléen:
x = int(x == 'true')
int()
transforme le booléen en 1
ou 0
. Notez que toute valeur non égale à 'true'
entraînera le 0
renvoi.
str
.
u'true' == 'true'
, la fonction se comporte correctement indépendamment du type d'entrée [entre str
et unicode
].
u'true' == 'true'
et que nous ne savons pas quel est le cas d'utilisation. Peut-être qu'ils veulent un comportement différent pour la situation où type(x) != unicode
.
arrayvalue == 'true'
comparaison, la question à laquelle j'ai répondu ici est spécifique à une valeur de chaîne (unicode).
Si B
est un tableau booléen, écrivez
B = B*1
(Un peu de code golfique.)
numpy.multiply(B,1)
œuvres.
B=map(int,B)
renvoyé un objet de carte en python 3 pour moi.
Voici une autre solution à votre problème:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Cela fonctionne parce que la somme des codes ASCII de 'true'
est 448
, qui est paire, tandis que la somme des codes ASCII de 'false'
est 523
qui est impaire.
La chose amusante à propos de cette solution est que son résultat est assez aléatoire si l'entrée ne fait pas partie de 'true'
ou 'false'
. La moitié du temps, il reviendra 0
, et l'autre moitié 1
. La variante utilisant encode
lèvera une erreur de codage si l'entrée n'est pas ASCII (augmentant ainsi l'indéfini-ness du comportement).
Sérieusement, je pense que la solution la plus lisible et la plus rapide consiste à utiliser un if
:
def to_bool(s):
return 1 if s == 'true' else 0
Voir quelques 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
Remarquez que la if
solution est au moins 2,5 fois plus rapide que toutes les autres solutions. Cela n'a pas de sens de mettre comme une exigence d'éviter d'utiliser if
s sauf s'il s'agit d'une sorte de devoir (auquel cas vous n'auriez pas dû demander cela en premier lieu).
Si vous avez besoin d'une conversion à usage général à partir d'une chaîne qui en soi n'est pas un booléen, vous devriez mieux écrire une routine similaire à celle décrite ci-dessous. Conformément à l'esprit du typage du canard, je n'ai pas passé l'erreur en silence, mais je l'ai convertie en fonction du scénario actuel.
>>> 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 chaîne ne contient pas 'true'
ou 'false'
c'est une erreur de valeur . Si l'entrée n'est pas une chaîne, vous obtiendrez (99,99% des fois) an à la AttributeError
place, il est donc inutile de l'attraper ValueError
et de la re-soulever comme TypeError
.
index
levée d'une AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
appel car c'était la seule solution qui faisait ce calcul supplémentaire et il n'aurait pas été correct de l'inclure dans le micro-benchmark. Bien sûr, même cela try...except
prend un peu de temps, mais la différence est petite si aucune exception n'est soulevée (comme 20ns
moins ou plus).
seulement avec ceci:
const a = vrai; const b = faux;
console.log (+ a); // 1 console.log (+ b); // 0