Czy istnieje sposób na przekonwertowanie true
typu unicode
na 1 i false
typu unicode
na 0 (w Pythonie)?
Na przykład: x == 'true' and type(x) == unicode
chcę x = 1
PS: nie chcę używać if
- else
.
Użyj int()
w teście boolowskim:
x = int(x == 'true')
int()
zamienia wartość logiczną na 1
lub 0
. Zwróć uwagę, że każda wartość, która nie jest równa, 'true'
spowoduje 0
zwrócenie.
str
.u'true' == 'true'
funkcja zachowuje się poprawnie niezależnie od typu danych wejściowych [pomiędzystr
iunicode
].u'true' == 'true'
, że nie wiemy, jaki jest przypadek użycia. Może chcą innego zachowania w sytuacji, w którejtype(x) != unicode
.arrayvalue == 'true'
porównania, pytanie, na które tutaj odpowiedziałem, dotyczy wartości string (Unicode).Jeśli
B
jest tablicą boolowską, napisz(Trochę kodu golfowego.)
źródło
numpy.multiply(B,1)
działa.B=map(int,B)
zwróciło mi obiekt mapy w pythonie 3.Możesz użyć
x.astype('uint8')
gdziex
jest twoja tablica logiczna.źródło
Oto jeszcze jedno rozwiązanie Twojego problemu:
To działa, ponieważ suma kodów ASCII
'true'
Is448
, który jest nawet, gdy suma kodów ASCII'false'
Is523
co jest dziwne.Zabawne w tym rozwiązaniu jest to, że jego wynik jest dość losowy, jeśli wejście nie jest jednym z
'true'
lub'false'
. W połowie czasu wróci0
, a drugą połowę1
. Wariant wykorzystującyencode
spowoduje zgłoszenie błędu kodowania, jeśli dane wejściowe nie są w formacie ASCII (zwiększając w ten sposób nieokreśloność zachowania).Poważnie, uważam, że najbardziej czytelnym i szybszym rozwiązaniem jest użycie
if
:Zobacz kilka mikroznaków:
Zwróć uwagę, że
if
rozwiązanie jest co najmniej 2,5 razy szybsze niż wszystkie inne rozwiązania. To nie nie ma sensu, aby umieścić jako wymóg, aby unikaćif
s wyjątkiem sytuacji, gdy jest to jakiś rodzaj pracy domowej (w takim przypadku nie należy prosić to w pierwszej kolejności).źródło
Jeśli potrzebujesz konwersji ogólnego przeznaczenia z łańcucha, który sam w sobie nie jest wartością logiczną, lepiej napisać procedurę podobną do przedstawionej poniżej. Zgodnie z duchem pisania kaczkami nie przeszedłem po cichu błędu, ale przekonwertowałem go tak, aby był odpowiedni dla obecnego scenariusza.
źródło
TypeError
? Jeśli ciąg nie zawiera'true'
lub'false'
jest to błąd wartości . Jeśli dane wejściowe nie są ciągami znaków,AttributeError
zamiast nich (w 99,99% przypadków) otrzymasz an , stąd bezcelowe jest łapanieValueError
i ponowne podnoszenie jakoTypeError
.index
podniesienia błędu AttributeError, tak z ciekawości ?return ['false', 'true'].index(s) except (ValueError, AttributeError)
.lower()
wywołanie, ponieważ było to jedyne rozwiązanie, które wykonało te dodatkowe obliczenia i nie byłoby poprawne włączenie go do mikro-testu. Jasne, nawettry...except
zajmuje to trochę czasu, ale różnica jest niewielka, jeśli nie zostanie zgłoszony żaden wyjątek (20ns
mniej więcej).bool do int:
x = (x == 'true') + 0
Teraz x zawiera 1, jeśli w przeciwnym razie
x == 'true'
0.Uwaga:
x == 'true'
zwróci wartość bool, która zostanie następnie wpisana do typu int o wartości (1, jeśli wartość bool to True else 0) po dodaniu z 0.źródło
tylko z tym:
const a = true; const b = false;
console.log (+ a); // 1 console.log (+ b); // 0
źródło