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
.
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 [entrestr
etunicode
].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(Un peu de code golfique.)
la source
numpy.multiply(B,1)
œuvres.B=map(int,B)
renvoyé un objet de carte en python 3 pour moi.Vous pouvez utiliser
x.astype('uint8')
wherex
est votre tableau booléen.la source
Voici une autre solution à votre problème:
Cela fonctionne parce que la somme des codes ASCII de
'true'
est448
, qui est paire, tandis que la somme des codes ASCII de'false'
est523
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 reviendra0
, et l'autre moitié1
. La variante utilisantencode
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
:Voir quelques microbenchmarks:
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'utiliserif
s sauf s'il s'agit d'une sorte de devoir (auquel cas vous n'auriez pas dû demander cela en premier lieu).la source
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.
la source
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 à laAttributeError
place, il est donc inutile de l'attraperValueError
et de la re-soulever commeTypeError
.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 celatry...except
prend un peu de temps, mais la différence est petite si aucune exception n'est soulevée (comme20ns
moins ou plus).booléen à int:
x = (x == 'true') + 0
Maintenant, le x contient 1
x == 'true'
sinon 0.Remarque:
x == 'true'
retournera un booléen qui sera ensuite transtypé en int ayant une valeur (1 si la valeur booléenne est True sinon 0) lorsqu'il est ajouté avec 0.la source
seulement avec ceci:
const a = vrai; const b = faux;
console.log (+ a); // 1 console.log (+ b); // 0
la source