Adakah yang tahu cara melakukan konversi dari string ke boolean dengan Python? Saya menemukan tautan ini . Tapi itu tidak terlihat seperti cara yang tepat untuk melakukannya. Yaitu menggunakan fungsionalitas bawaan, dll.
Alasan saya menanyakan hal ini adalah karena saya belajar int("string")
dari sini. Tetapi ketika mencobanya bool("string")
selalu kembali True
:
>>> bool("False")
True
distutils.util.strtobool(some_string)
. Secara teknis output adalah tipeint
dengan nilai0
atau1
-> jika Anda benar-benar ingin / perlubool
maka Anda dapat membungkus fungsi itu denganbool(distutils.util.strtobool(some_string))
.distutils.util.strtobool
tidak dapat menangani asing ya / tidak, tidak seperti solusi oleh @kmonsoor, yang bagaimanapun tidak dapat menangani file CSV buatan Excel dengan Benar / Salah dalam bahasa asing (mis.VERO
,FALSO
). Jadi reinvention roda kadang-kadang diperlukan.Jawaban:
Sungguh, Anda hanya membandingkan string dengan apa pun yang Anda harapkan diterima mewakili benar, sehingga Anda dapat melakukan ini:
Atau untuk memeriksa sejumlah nilai:
Berhati-hatilah saat menggunakan yang berikut ini:
String kosong dievaluasi untuk
False
, tetapi semua yang lain dievaluasiTrue
. Jadi ini tidak boleh digunakan untuk keperluan parsing apa pun.sumber
s == "True"
. Tetapi saya telah melihat orang-orang mengacaukan ini. def convert (s): if s == "True": return True; mengembalikan False.bool("False")
. Itu akan selalu dilemparkan keTrue
.Menggunakan:
Sadarilah bahwa
distutils.util.strtobool()
mengembalikan representasi integer dan karenanya perlu dibungkus denganbool()
untuk mendapatkan nilai Boolean.sumber
1
/0
tidakTrue
/False
, jadi Anda harus membungkus hasilnya dalam bool () untuk mendapatkan boolean yang sebenarnya:bool(distutils.util.strtobool(some_string))
None
danstr(None)
sebagai input.bool
alih-alih1
/0
selama Anda tidak melakukan hal-hal buruk sepertiif x == False
... dan jika Anda berurusan denganint
s danNone
s Anda tidak memerlukan fungsi khusus, Anda bisa memeriksanya langsungif myint:
atauif not maybe_none_var:
bool
adalah sub-kelas dariint
Kemudian menyebutnya seperti ini:
Menangani benar dan salah secara eksplisit:
Anda juga dapat membuat fungsi Anda secara eksplisit memeriksa daftar kata yang benar dan daftar kata yang salah. Maka jika itu tidak ada dalam daftar, Anda bisa melempar pengecualian.
sumber
Parser JSON juga berguna untuk mengkonversi string secara umum menjadi tipe python yang masuk akal.
sumber
.lower()
Dimulai dengan Python 2.6, sekarang ada
ast.literal_eval
:Yang tampaknya berhasil, selama Anda yakin string Anda akan berupa
"True"
atau"False"
:Saya biasanya tidak merekomendasikan ini, tetapi ini sepenuhnya built-in dan bisa menjadi hal yang tepat tergantung pada kebutuhan Anda.
sumber
Jika Anda tahu string akan berupa
"True"
atau"False"
, Anda bisa menggunakannyaeval(s)
.Gunakan ini hanya jika Anda yakin akan isi string, karena akan mengeluarkan pengecualian jika string tidak mengandung Python yang valid, dan juga akan mengeksekusi kode yang terkandung dalam string.
sumber
if eval(os.environ["LOL"]): #might never reach here. Might also charge your company's credit card.
Versi ini menjaga semantik konstruktor seperti int (nilai) dan menyediakan cara mudah untuk mendefinisikan nilai string yang dapat diterima.
sumber
Ini versi saya. Ini memeriksa daftar nilai positif dan negatif, meningkatkan pengecualian untuk nilai yang tidak diketahui. Dan itu tidak menerima string, tetapi semua jenis harus dilakukan.
Sampel berjalan:
sumber
to_bool(["hello"])
yang seharusnya menjadi panggilan yang benar-benar valid, jika[]
didukungto_bool([])
. Sebagai gantinya dia akan melakukan sesuatu di sepanjang baris ini:myList=someFunctionThatReturnAList
`if (is_bool (myList)): ... ´ jadi orang memiliki daftar dan ingin tahu apakah daftar ini Tidak ada atau kosong.Anda selalu bisa melakukan sesuatu seperti
bit pada parens akan dievaluasi menjadi False. Ini hanyalah cara lain untuk melakukannya tanpa harus melakukan pemanggilan fungsi yang sebenarnya.
sumber
val = "false"
dilakukan garis pada contoh ini? Kenapa disana? Apa artinya?Trik yang keren dan sederhana (berdasarkan apa yang diposting @Alan Marchiori), tetapi menggunakan yaml:
Jika ini terlalu lebar, dapat disempurnakan dengan menguji hasil tipe. Jika jenis yaml-dikembalikan adalah str, maka itu tidak dapat dilemparkan ke jenis lain (yang dapat saya pikirkan), sehingga Anda dapat mengatasinya secara terpisah, atau membiarkannya benar.
Saya tidak akan menebak dengan cepat, tetapi karena saya bekerja dengan data yaml di bawah Qt gui, ini memiliki simetri yang bagus.
sumber
yaml
modul pihak ketiga perpustakaan: PyYAMLSaya tidak setuju dengan solusi apa pun di sini, karena mereka terlalu permisif. Ini biasanya tidak seperti yang Anda inginkan saat mengurai string.
Jadi di sini solusinya saya gunakan:
Dan hasilnya:
Untuk lebih jelas karena sepertinya jawaban saya menyinggung seseorang:
Intinya adalah bahwa Anda tidak ingin menguji hanya untuk satu nilai dan menganggap yang lainnya. Saya tidak berpikir Anda selalu ingin memetakan Benar-benar segalanya dengan nilai yang tidak diuraikan. Itu menghasilkan kode rawan kesalahan.
Jadi, jika Anda tahu kode apa yang Anda inginkan.
sumber
elif
redundan karena kata kembali, tetapi memberi Anda lebih banyak informasi tanpa harus memindaireturn
. Tapi itu hanya saya, jika ada pelanggaran gaya PEP, saya akan mengubahnya. Tanpa kendala lain, kita harus selalu mencari keterbacaan (dan standar melakukan itu). Terima kasih atas komentarnya dan menarik!Dict (sungguh-sungguh, defaultdict) memberi Anda cara yang cukup mudah untuk melakukan trik ini:
Sangat mudah untuk menyesuaikan metode ini dengan perilaku konversi yang tepat yang Anda inginkan - Anda dapat mengisinya dengan nilai Truthy dan Falsy yang diizinkan dan membiarkannya meningkatkan pengecualian (atau mengembalikan Tidak Ada) ketika nilai tidak ditemukan, atau default ke True, atau default ke False, atau apa pun yang Anda inginkan.
sumber
Anda mungkin sudah memiliki solusi tetapi untuk orang lain yang mencari metode untuk mengonversi nilai menjadi nilai boolean menggunakan nilai palsu "standar" termasuk Tidak Ada, [], {}, dan "" selain false, tidak, dan 0 .
sumber
not in
dan pilihan Anda untuk item palsu agak istimewa.Anda cukup menggunakan fungsi built-in eval () :
dan hasilnya:
sumber
Namun pilihan lain
Tetapi dalam produksi jika Anda tidak memerlukan yang mungkin dan semua dependensinya, ide yang baik adalah melihat kode sumbernya dan menyalin bagian dari logika yang Anda butuhkan.
sumber
Aturan biasa untuk casting untuk bool adalah bahwa beberapa literal khusus (
False
,0
,0.0
,()
,[]
,{}
) adalah palsu dan kemudian segala sesuatu yang lain adalah benar, jadi saya sarankan berikut:sumber
Ini adalah versi yang saya tulis. Menggabungkan beberapa solusi lain menjadi satu.
Jika mendapat string, ia mengharapkan nilai tertentu, jika tidak, akan menimbulkan Pengecualian. Jika tidak mendapatkan string, cukup biarkan konstruktor bool mengetahuinya. Menguji kasus ini:
sumber
str
sebagai gantitype('')
Jika Anda tahu bahwa input Anda adalah "Benar" atau "Salah" maka mengapa tidak menggunakan:
sumber
if s else False
. Pikirkan bagaimana"False" == "True"
akan kembaliFalse
.if type(s) is bool: return s
.saya menggunakan
sumber
Saya suka menggunakan operator ternary untuk ini, karena ini sedikit lebih ringkas untuk sesuatu yang terasa seperti tidak boleh lebih dari 1 baris.
sumber
Saya menyadari ini adalah posting lama, tetapi beberapa solusi memerlukan sedikit kode, inilah yang akhirnya saya gunakan:
sumber
Gunakan paket str2bool
pip install str2bool
sumber
Jika Anda suka saya hanya perlu boolean dari variabel yang merupakan string. Anda dapat menggunakan distils seperti yang disebutkan sebelumnya oleh @jzwiener. Namun saya tidak dapat mengimpor dan menggunakan modul seperti yang disarankannya.
Sebaliknya saya akhirnya menggunakannya dengan cara ini di python3.7
distutils adalah bagian dari python std lib jadi tidak perlu instalasi. Bagus sekali! 👍
sumber
Saya ingin berbagi solusi sederhana saya: gunakan
eval()
. Ini akan mengkonversi stringTrue
danFalse
untuk tipe boolean yang tepat JIKA string tersebut persis dalam format judulTrue
atauFalse
selalu huruf kapital pertama atau fungsi akan menimbulkan kesalahan.misalnya
Tentu saja untuk variabel dinamis, Anda dapat dengan mudah menggunakan
.title()
untuk memformat string boolean.Ini akan menimbulkan kesalahan.
sumber
inilah yang berbulu, dibangun untuk mendapatkan banyak jawaban yang sama. Perhatikan bahwa meskipun python dianggap
""
salah dan semua string lainnya benar, TCL memiliki gagasan yang sangat berbeda tentang berbagai hal.Hal yang baik tentang hal ini adalah cukup memaafkan tentang nilai yang dapat Anda gunakan. Ini malas mengubah string menjadi nilai, dan itu hygenic tentang apa yang diterima dan ditolak (perhatikan bahwa jika pernyataan di atas diberikan pada prompt tcl, itu akan menghapus hard disk pengguna).
yang buruk adalah bahwa itu mengharuskan Tkinter tersedia, yang biasanya, tetapi tidak benar secara universal, dan lebih penting lagi, mengharuskan instance Tk dibuat, yang relatif berat.
Apa yang dianggap benar atau salah tergantung pada perilaku
Tcl_GetBoolean
, yang menganggap0
,false
,no
danoff
menjadi palsu dan1
,true
,yes
danon
untuk menjadi kenyataan, kasus tidak sensitif. String lain, termasuk string kosong, menyebabkan pengecualian.sumber
ide: periksa apakah Anda ingin string dievaluasi menjadi False; jika tidak bool () mengembalikan True untuk string yang tidak kosong.
sumber
Inilah sesuatu yang saya lempar bersama untuk mengevaluasi kebenaran string:
hasil yang kurang lebih sama dengan menggunakan
eval
tetapi lebih aman.sumber
Saya hanya perlu melakukan ini ... jadi mungkin terlambat ke pesta - tetapi seseorang mungkin merasa berguna
sumber
Jika Anda memiliki kendali atas entitas yang mengembalikan
true
/false
, satu opsi adalah mengembalikannya1
/0
bukantrue
/false
, lalu:boolean_response = bool(int(response))
Pemain tambahan untuk
int
menangani respons dari jaringan, yang selalu berupa string.sumber
Dengan menggunakan
eval()
fungsi dan.capitalize()
metode bawaan Python , Anda dapat mengonversi string "benar" / "salah" (terlepas dari kapitalisasi awal) menjadi boolean Python sejati.Sebagai contoh:
sumber
#\nshutil.rmtree('/someImportantDirectory')
? (Jangan coba-coba!)eval
sesuatu yang sederhana ini hanya meminta kerentanan.eval
string itu mungkin membantu seseorang untuk mengambil alih seluruh sistem.