Gibt es eine Möglichkeit, true
vom Typ unicode
in 1 und false
vom Typ zu konvertieren ?unicode
in 0 (in Python) ?
Beispielsweise: x == 'true' and type(x) == unicode
Ich will x = 1
PS: Ich möchte nicht verwenden if
- else
.
Gibt es eine Möglichkeit, true
vom Typ unicode
in 1 und false
vom Typ zu konvertieren ?unicode
in 0 (in Python) ?
Beispielsweise: x == 'true' and type(x) == unicode
Ich will x = 1
PS: Ich möchte nicht verwenden if
- else
.
Antworten:
Verwendung int()
bei einem Booleschen Test:
x = int(x == 'true')
int()
verwandelt den Booleschen Wert in 1
oder 0
. Beachten Sie, dass jeder Wert nicht zu gleichen 'true'
führt zu 0
zurückgegeben werden.
str
.
u'true' == 'true'
dass sich die Funktion in Python2 unabhängig vom Eingabetyp [zwischen str
und unicode
] korrekt verhält .
u'true' == 'true'
und dass wir nicht wissen, was der Anwendungsfall ist. Vielleicht wollen sie ein anderes Verhalten für die Situation, in der type(x) != unicode
.
arrayvalue == 'true'
Vergleich erwarten . Die Frage, die ich hier beantwortet habe, ist spezifisch für einen Zeichenfolgenwert (Unicode).
Wenn B
es sich um ein boolesches Array handelt, schreiben Sie
B = B*1
(Ein bisschen Code Golf.)
numpy.multiply(B,1)
Arbeiten.
B=map(int,B)
führte, wurde für mich ein Kartenobjekt in Python 3 zurückgegeben.
Hier ist eine weitere Lösung für Ihr Problem:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Es funktioniert , weil die Summe des ASCII - Codes von 'true'
heißt 448
, die selbst ist, während die Summe des ASCII - Codes von 'false'
heißt , 523
die ungerade ist.
Das Lustige an dieser Lösung ist, dass das Ergebnis ziemlich zufällig ist, wenn die Eingabe nicht eine von 'true'
oder ist 'false'
. Die Hälfte der Zeit wird es zurückkehren 0
und die andere Hälfte 1
. Die verwendete Variante encode
löst einen Codierungsfehler aus, wenn die Eingabe nicht ASCII ist (wodurch die Undefiniertheit des Verhaltens erhöht wird).
Im Ernst, ich glaube, die am besten lesbare und schnellere Lösung ist die Verwendung von if
:
def to_bool(s):
return 1 if s == 'true' else 0
Siehe einige Mikrobenchmarks:
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
Beachten Sie, dass die if
Lösung mindestens 2,5- mal schneller ist als alle anderen Lösungen. Es ist nicht sinnvoll, if
s als Voraussetzung für die Vermeidung der Verwendung von s anzugeben, es sei denn, dies ist eine Art Hausaufgabe (in diesem Fall hätten Sie dies gar nicht erst fragen sollen).
Wenn Sie eine Allzweckkonvertierung von einer Zeichenfolge benötigen, die per se kein Bool ist, sollten Sie eine Routine schreiben, die der unten abgebildeten ähnlich ist. In Übereinstimmung mit dem Geist der Ententypisierung habe ich den Fehler nicht stillschweigend übergeben, sondern ihn entsprechend dem aktuellen Szenario konvertiert.
>>> 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
? Wenn die Zeichenfolge nicht enthalten 'true'
oder 'false'
es ist ein Wert Fehler. Wenn es sich bei der Eingabe nicht um eine Zeichenfolge handelt, erhalten Sie (in 99,99% der Fälle) AttributeError
stattdessen eine Zeichenfolge. Daher ist es sinnlos, sie abzufangen ValueError
und erneut zu erhöhen TypeError
.
index
das Auslösen eines AttributeError geben?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
Anruf zu entfernen , da dies die einzige Lösung war, die diese zusätzliche Berechnung durchgeführt hat, und es nicht richtig gewesen wäre, sie in den Mikro-Benchmark aufzunehmen. Sicher, auch das try...except
dauert ein bisschen, aber der Unterschied ist gering, wenn keine Ausnahme gemacht wird (wie 20ns
weniger oder so).
nur damit:
const a = true; const b = false;
console.log (+ a); // 1 console.log (+ b); // 0