Comment convertir false en 0 et true en 1 en python

Est-il possible de convertir true de type unicode en 1 et false de type unicode en 0 (en python)?

Par exemple: x == 'true' and type(x) == unicode

Je veux x = 1

PS: je ne veux pas utiliser sinon.

Utilisez 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 renvoi de 0 .

Super simple:

Si B est un tableau booléen, écrivez

 B=B*1 

C’est mon tour habituel.

Si vous avez besoin d’une conversion à usage général à partir d’une chaîne qui n’est pas en soi un booléen, vous devriez mieux écrire une routine similaire à celle décrite ci-dessous. Conformément à l’esprit du typage des canards, 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, AtsortingbuteError): raise ValueError('no Valid Conversion Possible') >>> str2bool('garbaze') Traceback (most recent call last): File "", line 1, in  str2bool('garbaze') File "", line 5, in str2bool raise TypeError('no Valid COnversion Possible') TypeError: no Valid Conversion Possible >>> str2bool('false') 0 >>> str2bool('True') 1 

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 python3 

Cela fonctionne parce que la sum des codes ASCII de 'true' est 448 , ce qui est pair, alors que la sum des codes ASCII de 'false' est 523 ce qui est impair.


Ce qui est amusant avec cette solution, c’est que son résultat est assez aléatoire si l’entrée n’est pas 'true' ou 'false' . La moitié du temps, il retournera 0 , et l’autre moitié 1 . La variante utilisant encode déclenchera une erreur de codage si l’entrée n’est pas ASCII (augmentant ainsi le caractère indéfini 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, AtsortingbuteError): ...: raise ValueError() In [17]: def str2bool2(s): ...: try: ...: return ('false', 'true').index(s) ...: except (ValueError, AtsortingbuteError): ...: 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 

Notez que la solution if est au moins 2,5 fois plus rapide que toutes les autres solutions. Cela n’a aucun sens de ne pas utiliser if s, sauf s’il s’agit d’une sorte de devoir (auquel cas vous n’auriez pas dû le demander en premier lieu).

Vous pouvez utiliser x.astype('uint8')x est votre tableau booléen.

Vous pouvez aussi utiliser strtobool :

 In [1]: import distutils In [2]: distutils.util.strtobool("false") Out[2]: 0 In [3]: distutils.util.strtobool("true") Out[3]: 1 

J’utilise pour convertir everywere en entier booléen:

 >>> x = 'I am a non-empty text' >>> int(bool(x)) 1 >>> x = '' # This is a empty text >>> int(bool(x)) 0 >>> x = True >>> int(bool(x)) 1 >>> x = False >>> int(bool(x)) 0 

bool to int: x = (x == 'true') + 0

Maintenant, le x contient 1 si x == 'true' sinon 0.

Note: x == 'true' retournera bool qui sera alors transtypé pour avoir la valeur (1 si la valeur bool est True sinon 0) avec 0.

 # create identity 3x3 masortingx with python list using list comprehension a = [[(i==j) for i in range(3)] for j in range(3)] print(a) [[True, False, False], [False, True, False], [False, False, True]] # now how to make true and false into 1 and 0 b = [[int(i==j) for i in range(3)] for j in range(3)] print(b) [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # Therefore, int(False) return 0 while int(True) returns 1 

J’utilise:

 >>> str(bool(0)) 'False' >>> str(bool(1)) 'True'