Có cách nào để chuyển đổi true
loại khôngunicode
thành 1 và false
kiểu unicode
thành 0 (trong Python) không?
Ví dụ: x == 'true' and type(x) == unicode
tôi muốn x = 1
Tái bút: Tôi không muốn sử dụng if
- else
.
Có cách nào để chuyển đổi true
loại khôngunicode
thành 1 và false
kiểu unicode
thành 0 (trong Python) không?
Ví dụ: x == 'true' and type(x) == unicode
tôi muốn x = 1
Tái bút: Tôi không muốn sử dụng if
- else
.
Câu trả lời:
Sử dụng int()
trong thử nghiệm boolean:
x = int(x == 'true')
int()
biến boolean thành 1
hoặc 0
. Lưu ý rằng bất kỳ giá trị nào không bằng 'true'
sẽ 0
được trả về.
str
.
u'true' == 'true'
vì vậy hàm hoạt động chính xác không phụ thuộc vào kiểu đầu vào [giữa str
và unicode
].
u'true' == 'true'
và chúng ta không biết trường hợp sử dụng là gì. Có thể họ muốn một hành vi khác cho tình huống type(x) != unicode
.
arrayvalue == 'true'
so sánh, câu hỏi tôi đã trả lời ở đây dành riêng cho giá trị chuỗi (unicode).
Nếu B
là một mảng Boolean, hãy viết
B = B*1
(Một đoạn mã bit golfy.)
numpy.multiply(B,1)
công trình.
B=map(int,B)
trả về một bản đồ bản đồ trong python 3 cho tôi.
Đây là một giải pháp khác cho vấn đề của bạn:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Nó hoạt động vì tổng của các mã ASCII của 'true'
là 448
, mà thậm chí, trong khi tổng các mã ASCII của 'false'
là 523
đó là số lẻ.
Điều buồn cười về giải pháp này là kết quả của nó khá ngẫu nhiên nếu đầu vào không phải là một trong 'true'
hoặc 'false'
. Một nửa thời gian nó sẽ quay trở lại 0
, và nửa còn lại 1
. Biến thể đang sử dụng encode
sẽ phát sinh lỗi mã hóa nếu đầu vào không phải là ASCII (do đó làm tăng tính không xác định của hành vi).
Nghiêm túc mà nói, tôi tin rằng giải pháp dễ đọc nhất và nhanh hơn là sử dụng if
:
def to_bool(s):
return 1 if s == 'true' else 0
Xem một số vi điểm:
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
Lưu ý rằng if
giải pháp này nhanh hơn ít nhất 2,5 lần so với tất cả các giải pháp khác. Sẽ không hợp lý khi đặt ra yêu cầu tránh sử dụng s ngoại trừ trường hợp đây là một dạng bài tập về nhà (trong trường hợp này, bạn không nên hỏi điều này ngay từ đầu).if
Nếu bạn cần chuyển đổi mục đích chung từ một chuỗi mà theo đó không phải là bool, tốt hơn bạn nên viết một quy trình tương tự như quy trình được mô tả bên dưới. Để giữ đúng tinh thần gõ vịt, tôi không âm thầm sửa lỗi mà chuyển đổi sao cho phù hợp với kịch bản hiện tại.
>>> 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
? Nếu chuỗi không chứa 'true'
hoặc 'false'
đó là lỗi giá trị . Nếu đầu vào không phải là một chuỗi AttributeError
, thay vào đó bạn sẽ nhận được (99,99% số lần) , do đó, việc bắt ValueError
và nâng lại nó là vô ích TypeError
.
index
việc tăng AttributeError không?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
cuộc gọi vì đây là giải pháp duy nhất thực hiện tính toán bổ sung này và sẽ không chính xác nếu đưa nó vào vi điểm chuẩn. Chắc chắn thậm chí try...except
mất một chút thời gian, nhưng sự khác biệt là nhỏ nếu không có ngoại lệ nào được nêu ra (như 20ns
ít hơn hoặc lâu hơn).
chỉ với cái này:
const a = true; const b = sai;
console.log (+ a); // 1 console.log (+ b); // 0