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
.
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 [zwischenstr
undunicode
] 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 dertype(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(Ein bisschen Code Golf.)
quelle
numpy.multiply(B,1)
Arbeiten.B=map(int,B)
führte, wurde für mich ein Kartenobjekt in Python 3 zurückgegeben.Sie können verwenden,
x.astype('uint8')
wox
sich Ihr Boolesches Array befindet.quelle
Hier ist eine weitere Lösung für Ihr Problem:
Es funktioniert , weil die Summe des ASCII - Codes von
'true'
heißt448
, 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ückkehren0
und die andere Hälfte1
. Die verwendete Varianteencode
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
:Siehe einige Mikrobenchmarks:
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).quelle
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.
quelle
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 abzufangenValueError
und erneut zu erhöhenTypeError
.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 dastry...except
dauert ein bisschen, aber der Unterschied ist gering, wenn keine Ausnahme gemacht wird (wie20ns
weniger oder so).bool to int:
x = (x == 'true') + 0
Jetzt enthält das x 1 if
x == 'true'
sonst 0.Hinweis:
x == 'true'
Gibt bool zurück, das dann mit dem Wert int (1, wenn der bool-Wert True else 0 ist) typisiert wird, wenn es mit 0 hinzugefügt wird.quelle
nur damit:
const a = true; const b = false;
console.log (+ a); // 1 console.log (+ b); // 0
quelle