Gibt es eine Möglichkeit, truevom Typ unicodein 1 und falsevom 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, truevom Typ unicodein 1 und falsevom 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 1oder 0. Beachten Sie, dass jeder Wert nicht zu gleichen 'true'führt zu 0zurückgegeben werden.
str.
u'true' == 'true'dass sich die Funktion in Python2 unabhängig vom Eingabetyp [zwischen strund 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 Bes 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 , 523die 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 0und die andere Hälfte 1. Die verwendete Variante encodelö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 ifLösung mindestens 2,5- mal schneller ist als alle anderen Lösungen. Es ist nicht sinnvoll, ifs 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) AttributeErrorstattdessen eine Zeichenfolge. Daher ist es sinnlos, sie abzufangen ValueErrorund erneut zu erhöhen TypeError.
indexdas 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...exceptdauert ein bisschen, aber der Unterschied ist gering, wenn keine Ausnahme gemacht wird (wie 20nsweniger oder so).
nur damit:
const a = true; const b = false;
console.log (+ a); // 1 console.log (+ b); // 0