Saya mencoba memeriksa apakah kamus kosong tetapi tidak berperilaku baik. Itu hanya melompati dan menampilkan ONLINE tanpa apa pun kecuali menampilkan pesan. Ada ide mengapa?
def isEmpty(self, dictionary):
for element in dictionary:
if element:
return True
return False
def onMessage(self, socket, message):
if self.isEmpty(self.users) == False:
socket.send("Nobody is online, please use REGISTER command" \
" in order to register into the server")
else:
socket.send("ONLINE " + ' ' .join(self.users.keys()))
python
dictionary
Royal
sumber
sumber
self.users
tidak kosong, lakukan sajaif self.users
.isEmpty
benar - benar kembaliTrue
jika kunci pertama yang dihasilkan dari kamus benar dan mengembalikanFalse
sebaliknya. Jika kamus kosong, kamus ini mengembalikanNone
yang tidak== False
.Jawaban:
Kamus kosong mengevaluasi ke
False
dalam Python:Dengan demikian,
isEmpty
fungsi Anda tidak perlu. Yang perlu Anda lakukan adalah:sumber
bool({False: False})
masih dievaluasi untukTrue
. Tautan yang Anda berikan terkait denganany
metode, yang tergantung pada kunci.not <dict>
tidak begitu jelas jugaBerikut adalah tiga cara Anda dapat memeriksa apakah dikte kosong. Saya lebih suka menggunakan cara pertama saja. Dua cara lainnya terlalu bertele-tele.
sumber
if x
saat x adalah array numpyjika panjangnya nol berarti dict kosong
sumber
len(dict.keys())
setara denganlen(dict)
dict.__len__
mungkin sedikit lebih cepat. :)Cara-cara sederhana untuk memeriksa dict kosong adalah di bawah ini:
Meskipun metode 1 lebih ketat seperti ketika a = Tidak ada, metode 1 akan memberikan hasil yang benar tetapi metode 2 akan memberikan hasil yang salah.
sumber
Kamus dapat secara otomatis dilemparkan ke boolean yang mengevaluasi
False
untuk kamus kosong dan kamusTrue
tidak kosong.Jika ini terlihat terlalu idiomatis, Anda juga dapat menguji
len(myDictionary)
nol, atauset(myDictionary.keys())
untuk set kosong, atau hanya menguji kesetaraan dengan{}
.Fungsi isEmpty tidak hanya tidak perlu tetapi juga implementasi Anda memiliki beberapa masalah yang dapat saya temukan prima-facie.
return False
pernyataan lebih menjorok satu tingkat terlalu dalam. Itu harus di luar for loop dan pada tingkat yang sama denganfor
pernyataan. Akibatnya, kode Anda hanya akan memproses satu, kunci yang dipilih secara sewenang-wenang, jika ada kunci. Jika kunci tidak ada, fungsi akan kembaliNone
, yang akan dilemparkan ke boolean False. Aduh! Semua kamus kosong akan diklasifikasikan sebagai false-nagatives.return False
pernyataan dan membawanya di luarfor
lingkaran. Maka yang Anda dapatkan adalah boolean ATAU semua kunci, atauFalse
jika kamus kosong. Tetap saja Anda akan memiliki positif palsu dan negatif palsu. Lakukan koreksi dan uji terhadap kamus berikut untuk bukti.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
sumber
Anda juga dapat menggunakan get (). Awalnya saya percaya hanya memeriksa apakah kunci ada.
Yang saya suka dengan get adalah itu tidak memicu pengecualian, sehingga membuatnya mudah untuk melintasi struktur besar.
sumber
Mengapa tidak menggunakan tes kesetaraan?
sumber
gunakan 'apa saja'
sumber
any
memeriksa apakah dict berisi kunci kebenaran, mis.any({0: 'something'})
mengembalikanFalse
meskipun dict tidak kosong