Чи існує спосіб перетворення true
типу unicode
в 1 і false
типу unicode
в 0 (в Python)?
Наприклад: x == 'true' and type(x) == unicode
я хочу x = 1
PS: Я не хочу використовувати if
- else
.
Чи існує спосіб перетворення true
типу unicode
в 1 і false
типу unicode
в 0 (в Python)?
Наприклад: x == 'true' and type(x) == unicode
я хочу x = 1
PS: Я не хочу використовувати if
- else
.
Відповіді:
Використовувати int()
на булевому тесті:
x = int(x == 'true')
int()
перетворює булеву в 1
або 0
. Зауважте, що будь-яке значення, яке не дорівнює 'true'
, призведе до 0
повернення.
str
.
u'true' == 'true'
така функція поводиться правильно незалежно від типу введення [між str
та unicode
].
u'true' == 'true'
що ми не знаємо, що таке використання. Можливо, вони хочуть іншої поведінки для ситуації, де type(x) != unicode
.
arrayvalue == 'true'
порівняння, питання, на яке я тут відповів, стосується значення рядка (unicode).
Якщо B
булевий масив, пишіть
B = B*1
(Трохи код гольф.)
numpy.multiply(B,1)
твори.
B=map(int,B)
для мене. Хоча оригінальне видання дало приємні, працездатні результати, повернуло для мене об'єкт карти в python 3.
Ось ще одне рішення вашої проблеми:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Він працює тому, що сума кодів ASCII 'true'
є 448
, яка є парною, тоді як сума кодів ASCII 'false'
, 523
яка непарна.
Найсмішніше в цьому рішенні є те , що його результатом є досить випадковим , якщо вхід НЕ один з 'true'
чи 'false'
. Половину часу вона повернеться 0
, а іншу половину 1
. Варіант використання encode
призведе до помилки кодування, якщо вхід не ASCII (таким чином збільшується невизначеність поведінки).
Серйозно, я вважаю, що найчитабельнішим та швидшим рішенням є використання if
:
def to_bool(s):
return 1 if s == 'true' else 0
Ознайомтеся з деякими мікро-орієнтирами:
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
Зауважте, як if
рішення принаймні в 2,5 рази швидше, ніж усі інші рішення. Це НЕ має сенсу ставити як вимога , щоб уникнути використання if
S , за винятком , якщо це якесь - то домашній (в цьому випадку ви не повинні були запитати це в першу чергу).
Якщо вам потрібна конверсія загального призначення з рядка, яка сама по собі не є булом, вам краще написати процедуру, подібну до зображеної нижче. Відповідно до духу набору тексту качки, я не мовчки передавав помилку, а перетворював її як відповідну для поточного сценарію.
>>> 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
? Якщо рядок не містить 'true'
або 'false'
це помилка значення . Якщо введення не є рядком, ви отримаєте (99,99% разів) AttributeError
натомість, отже, марно його ловити ValueError
та повторно піднімати як TypeError
.
index
підвищення AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
виклик, оскільки це було єдиним рішенням, яке зробило це додаткове обчислення, і не було б коректним включити його в мікропоказник. Впевнені, що навіть try...except
потрібно небагато часу, але різниця невелика, якщо не робиться жодного винятку (як-небудь 20ns
менше).
тільки з цим:
const a = вірно; const b = хибно;
console.log (+ a); // 1 console.log (+ b); // 0