Hoe converteer je ‘false’ naar 0 en ‘true’ naar 1?

Is er een manier om truevan het type unicodenaar 1 en falsevan het type unicodenaar 0 te converteren (in Python)?

Bijvoorbeeld: x == 'true' and type(x) == unicode

Ik wil x = 1

PS: ik wil ifelseniet gebruiken.


Antwoord 1, autoriteit 100%

Gebruik int()op een booleaanse test:

x = int(x == 'true')

int()verandert de boolean in 1of 0. Houd er rekening mee dat elke waarde nietgelijk aan 'true'resulteert in 0als resultaat.


Antwoord 2, autoriteit 84%

Als Been Booleaanse array is, schrijf dan

B = B*1

(Een beetje code golfy.)


Antwoord 3, autoriteit 6%

U kunt x.astype('uint8')gebruiken waarbij xuw Booleaanse array is.


Antwoord 4, autoriteit 5%

Hier is nog een andere oplossing voor uw probleem:

def to_bool(s):
    return 1 - sum(map(ord, s)) % 2
    # return 1 - sum(s.encode('ascii')) % 2  # Alternative for Python 3

Het werkt omdat de som van de ASCII-codes van 'true'448is, wat even is, terwijl de som van de ASCII-codes van 'false'is 523wat vreemd is.


Het grappige van deze oplossing is dat het resultaat vrij willekeurig is als de invoer nieteen van 'true'of 'false'. De helft van de tijd retourneert het 0, en de andere helft 1. De variant die encodegebruikt, zal een coderingsfout veroorzaken als de invoer niet ASCII is (waardoor de ongedefinieerdheid van het gedrag toeneemt).


Serieus, ik geloof dat de meest leesbare, en snellereoplossing is om een ​​ifte gebruiken:

def to_bool(s):
    return 1 if s == 'true' else 0

Bekijk enkele 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

Kijk hoe de if-oplossing minstens2,5xkeer snelleris dan allemaalde andere oplossingen. Het heeft nietzin om als eis te stellen dat je geen ifs moet gebruiken, behalve als dit een soort huiswerk is (in dat geval had je dit niet in de eerste plaats).


Antwoord 5, autoriteit 3%

Als je een algemene conversie nodig hebt van een string die op zich geen bool is, kun je beter een routine schrijven die lijkt op die hieronder. In overeenstemming met de geest van het typen van eenden, heb ik de fout niet stilzwijgend doorgegeven, maar geconverteerd zoals geschikt voor het huidige scenario.

>>> 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

Antwoord 6, autoriteit 2%

+(False)converteert naar 0 en
+(True)converteert naar 1


Antwoord 7

Elk van het volgende zal werken:

s = "true"
(s == 'true').real
1
(s == 'false').real
0
(s == 'true').conjugate()    
1
(s == '').conjugate()
0
(s == 'true').__int__()
1
(s == 'opal').__int__()    
0
def as_int(s):
    return (s == 'true').__int__()
>>>> as_int('false')
0
>>>> as_int('true')
1

Antwoord 8

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

De x bevat nu 1 if x == 'true'else 0.

Opmerking: x == 'true'retourneert bool die vervolgens wordt getypecast naar int met waarde (1 als bool-waarde True is, anders 0) wanneer toegevoegd met 0.


Antwoord 9

alleen bij dit:

const a = waar;
const b = onwaar;

console.log(+a);//1
console.log(+b);//0

Other episodes