Apakah ada cara untuk mengubah true
tipe unicode
menjadi 1 dan false
tipe unicode
menjadi 0 (dengan Python)?
Sebagai contoh: x == 'true' and type(x) == unicode
saya ingin x = 1
PS: Saya tidak ingin menggunakan if
- else
.
Apakah ada cara untuk mengubah true
tipe unicode
menjadi 1 dan false
tipe unicode
menjadi 0 (dengan Python)?
Sebagai contoh: x == 'true' and type(x) == unicode
saya ingin x = 1
PS: Saya tidak ingin menggunakan if
- else
.
Jawaban:
Gunakan int()
pada uji boolean:
x = int(x == 'true')
int()
mengubah boolean menjadi 1
atau 0
. Perhatikan bahwa nilai apa pun yang tidak sama dengan 'true'
akan 0
dikembalikan.
str
.
u'true' == 'true'
sehingga fungsi berperilaku dengan benar secara independen dari tipe input [antara str
dan unicode
].
u'true' == 'true'
dan kita tidak tahu apa use case-nya. Mungkin mereka menginginkan perilaku yang berbeda untuk situasi dimana type(x) != unicode
.
arrayvalue == 'true'
perbandingan, pertanyaan yang saya jawab di sini khusus untuk nilai string (unicode).
Jika B
adalah array Boolean, tulis
B = B*1
(Sedikit kode golf.)
numpy.multiply(B,1)
karya.
B=map(int,B)
mengembalikan peta obejct di python 3 untuk saya.
Inilah solusi lain untuk masalah Anda:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
Ia bekerja karena jumlah dari kode ASCII dari 'true'
yaitu 448
, yang bahkan, sedangkan jumlah dari kode ASCII dari 'false'
yaitu 523
yang aneh.
Hal yang lucu tentang solusi ini adalah hasilnya cukup acak jika inputnya bukan salah satu 'true'
atau 'false'
. Separuh waktu akan kembali 0
, dan separuh lainnya 1
. Varian yang menggunakan encode
akan memunculkan kesalahan encoding jika inputnya bukan ASCII (sehingga meningkatkan perilaku yang tidak ditentukan).
Serius, saya yakin solusi yang paling mudah dibaca dan lebih cepat adalah dengan menggunakan if
:
def to_bool(s):
return 1 if s == 'true' else 0
Lihat beberapa microbenchmark:
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
Perhatikan bagaimana if
solusinya setidaknya 2,5x kali lebih cepat dari semua solusi lainnya. Ini tidak masuk akal untuk menempatkan sebagai syarat untuk menghindari penggunaan if
s kecuali jika ini adalah beberapa jenis pekerjaan rumah (dalam hal ini Anda tidak harus meminta ini di tempat pertama).
Jika Anda memerlukan konversi tujuan umum dari string yang sebenarnya bukan bool, sebaiknya Anda menulis rutinitas yang serupa dengan yang digambarkan di bawah ini. Sesuai dengan semangat mengetik bebek, saya tidak melewati kesalahan tersebut secara diam-diam, tetapi mengubahnya sesuai dengan skenario saat ini.
>>> 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
? Jika string tidak mengandung 'true'
atau 'false'
itu adalah kesalahan nilai . Jika inputnya bukan string, Anda akan mendapatkan (99,99% dari waktu) an AttributeError
, maka tidak ada gunanya menangkap ValueError
dan menaikkannya kembali sebagai TypeError
.
index
cara meningkatkan AttributeError?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
.
lower()
panggilan karena ini adalah satu-satunya solusi yang melakukan perhitungan tambahan ini dan tidak akan benar untuk memasukkannya ke dalam tolok ukur mikro. Memang sih try...except
memakan waktu agak lama, tapi bedanya kecil kalau tidak terkecuali dinaikkan (seperti 20ns
kurang atau lebih).
hanya dengan ini:
const a = true; const b = salah;
console.log (+ a); // 1 console.log (+ b); // 0