Saya punya daftar Boolean:
[True, True, False, False, False, True]
dan saya mencari cara untuk menghitung jumlah True
dalam daftar (jadi dalam contoh di atas, saya ingin kembali menjadi 3
.) Saya telah menemukan contoh mencari jumlah kemunculan elemen-elemen tertentu, tetapi apakah ada lebih cara efisien untuk melakukannya karena saya bekerja dengan Boolean? Saya sedang memikirkan sesuatu yang analog dengan all
atau any
.
Jawaban:
True
sama dengan1
.sumber
issubclass(bool, int)
ternyata tahan, jadi tidak ada paksaan.list
memilikicount
metode:Ini sebenarnya lebih efisien daripada
sum
, juga lebih eksplisit tentang maksudnya, jadi tidak ada alasan untuk menggunakansum
:sumber
sum
jawaban lain jika Anda memiliki nilai "benar" lain selain 1 atau Benar juga. Selain itu, pertanyaan tidak menyebutkan apa pun kecualiTrue
atauFalse
.Jika Anda hanya peduli dengan konstanta
True
, yang sederhanasum
baik-baik saja. Namun, perlu diingat bahwa dalam Python nilai-nilai lain juga dievaluasiTrue
. Solusi yang lebih kuat adalah dengan menggunakanbool
builtin:UPDATE: Berikut ini adalah solusi lain yang sama kuatnya yang memiliki keuntungan lebih transparan:
PS Python trivia:
True
bisa benar tanpa menjadi 1. Peringatan: jangan coba-coba ini di tempat kerja!Jauh lebih jahat:
sumber
if
pernyataan) lebih rumit dari sekedar pengujianTrue
. Lihat docs.python.org/py3k/library/stdtypes.html#truth . ItuTrue = 2
hanya untuk menegaskan bahwa konsep "benar" lebih kompleks; dengan sedikit kode tambahan (yaitu menggunakanbool()
) Anda dapat membuat solusinya lebih kuat dan lebih umum.True
danFalse
merupakan kata kunci dan Anda tidak dapat mengubahnya.Anda bisa menggunakan
sum()
:sumber
Demi kelengkapan saja (
sum
biasanya lebih disukai), saya ingin menyebutkan bahwa kita juga dapat menggunakanfilter
untuk mendapatkan nilai-nilai kebenaran. Dalam kasus biasa,filter
menerima fungsi sebagai argumen pertama, tetapi jika Anda melewatinyaNone
, itu akan memfilter untuk semua nilai "benar". Fitur ini agak mengejutkan, tetapi didokumentasikan dengan baik dan berfungsi baik di Python 2 dan 3.Perbedaan antara versi, adalah bahwa dalam Python 2
filter
mengembalikan daftar, sehingga kita dapat menggunakanlen
:Namun dalam Python 3,
filter
mengembalikan sebuah iterator, jadi kita tidak dapat menggunakanlen
, dan jika kita ingin menghindari penggunaansum
(untuk alasan apa pun) kita perlu menggunakan konversi iterator ke daftar (yang membuatnya jauh lebih tidak cantik):sumber
Setelah membaca semua jawaban dan komentar pada pertanyaan ini, saya berpikir untuk melakukan percobaan kecil.
Saya menghasilkan 50.000 boolean acak dan memanggil
sum
dancount
terus menggunakannya.Inilah hasil saya:
Untuk memastikannya, saya mengulanginya beberapa kali:
Dan seperti yang Anda lihat,
count
3 kali lebih cepat darisum
. Jadi saya akan menyarankan untuk menggunakancount
seperti yang saya lakukan dicount_it
.Versi Python: 3.6.7
Core CPU: 4
Ukuran RAM: 16 GB
OS: Ubuntu 18.04.1 LTS
sumber
Lebih aman untuk dijalankan
bool
terlebih dahulu. Ini mudah dilakukan:Kemudian Anda akan menangkap semua yang Python anggap Benar atau Salah ke dalam ember yang sesuai:
Jika Anda suka, Anda dapat menggunakan pemahaman:
sumber
Saya lebih suka
len([b for b in boollist if b is True])
(atau setara dengan ekspresi generator), karena cukup jelas. Kurang 'ajaib' daripada jawaban yang diajukan oleh Ignacio Vazquez-Abrams.Atau, Anda dapat melakukan ini, yang masih mengasumsikan bahwa bool dapat dikonversi ke int, tetapi tidak membuat asumsi tentang nilai True:
ntrue = sum(boollist) / int(True)
sumber
if b
. Tetapi, yang lebih penting, Anda membangun daftar membuang yang membutuhkan semua nilai dalam memori sekaligus dan Anda tidak dapat menggunakanlen
dengan ekspresi generator. Lebih baik hindari praktik semacam itu sehingga solusinya dapat berkembang.if b
benar-benar salah. Itu hanya akan benar jika pertanyaannya adalah tentang item yang mengevaluasi sebagai True, bukan boolean Sejati yang sebenarnya. Saya mengambil poin kedua Anda. Kalau begitu ada variasinyasum(1 if b is True else 0 for b in boollist)
.sum(1 for b in boollist if b is True)