Comment faire pour convertir la valeur ‘false’ à 0, et ‘true’ pour 1 en python
Est-il un moyen de convertir true
de type unicode
à 1 et false
de type unicode
à 0 (en python)?
Pour exemple: x == 'true' and type(x) == unicode
Je veux x = 1
PS: je ne veux pas utiliser des if-else.
Vous devez vous connecter pour publier un commentaire.
Utilisation
int()
sur un boolean test:int()
tourne le booléen dans1
ou0
. À noter que toute valeur pas égal à'true'
entraînera0
retourné.str
.u'true' == 'true'
donc, la fonction se comporte correctement indipendently du type d'entrée [entrestr
etunicode
].u'true' == 'true'
et que nous ne savons pas ce que les cas d'utilisation. Peut-être qu'ils veulent un comportement différent de la situation oùtype(x) != unicode
.arrayvalue == 'true'
comparaison, la question j'ai répondu ici est spécifique à une chaîne de caractères (unicode) de la valeur.Si
B
est un booléen tableau, écrire(Un peu de code golfy)
B=map(int,B)
.numpy.multiply(B,1)
œuvres.B=map(int,B)
retourné une carte obejct en python 3 pour moi.B *= 1
B = (expression) * 1
Si vous avez besoin d'un usage général, la conversion d'une chaîne qui en soi n'est pas un booléen, il est mieux d'écrire une routine similaire à celle décrite ci-dessous. En accord avec l'esprit de duck-typing, je n'ai pas silencieusement passé à l'erreur, mais converti comme approprié pour le scénario actuel.
TypeError
? Si le string ne contient pas'true'
ou'false'
c'est un valeur d'erreur. Si l'entrée n'est pas une chaîne de caractères que vous allez recevoir (à 99,99% du temps) unAttributeError
au lieu de cela, donc il est inutile de les attraper pourValueError
et de la relancer commeTypeError
.index
élever un AttributeError?index
permettrait de relever l'erreur?return ['false', 'true'].index(s) except (ValueError, AttributeError)
.lower()
appel, puisque c'était la seule solution qui a fait ce calcul supplémentaire et il n'aurait pas été correct de l'inclure dans le micro-benchmark. Sûr que même letry...except
prendre un peu de temps, mais la différence est faible si aucune exception n'est levée (comme20ns
moins ou plus).Voici encore une autre solution à votre problème:
Cela fonctionne parce que la somme des codes ASCII de
'true'
est448
, qui est la même, tandis que la somme des codes ASCII de'false'
est523
qui est impair.La chose drôle au sujet de cette solution est que le résultat est assez aléatoire si l'entrée est pas l'un des
'true'
ou'false'
. La moitié du temps, il sera de retour0
, et l'autre moitié1
. La variante en utilisantencode
déclenchera une erreur de codage si l'entrée n'est pas ASCII (augmentant ainsi la non défini-tion du comportement).Sérieusement, je crois que le plus lisible, et plus rapide, la solution est d'utiliser un
if
:Voir quelques microbenchmarks:
Remarquez comment le
if
solution est au moins 2,5 x fois plus rapide que tous les autres solutions. Il ne pas sens de mettre une condition pour éviter l'utilisation deif
s, sauf si c'est en quelques sorte des devoirs à la maison (dans ce cas, vous ne devriez pas avoir demandé, en premier lieu).Vous pouvez utiliser
x.astype('uint8')
oùx
est votre booléen tableau.bool int:
x = (x == 'true') + 0
Maintenant le x contient 1 si
x == 'true'
, 0 sinon.Remarque:
x == 'true'
sera de retour bool qui sera ensuite typecasted en int valeur (1 si la valeur booléenne est Vraie, 0 sinon) lorsqu'ils sont ajoutés à 0.Vous pouvez également utiliser
strtobool
:J'utilise: