Python: Memeriksa apakah 'Kamus' kosong sepertinya tidak berfungsi

396

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())) 
Royal
sumber
6
Untuk memeriksa apakah self.userstidak kosong, lakukan saja if self.users.
BrenBarn
4
Anda isEmptybenar - benar kembali Truejika kunci pertama yang dihasilkan dari kamus benar dan mengembalikan Falsesebaliknya. Jika kamus kosong, kamus ini mengembalikan Noneyang tidak == False.
Hyperboreus
Pernyataan if Anda terbalik.
Fisikawan Gila
hati-hati terhadap kunci seperti-salah stackoverflow.com/a/17347421/1379762
Wajih

Jawaban:

737

Kamus kosong mengevaluasi keFalse dalam Python:

>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>

Dengan demikian, isEmptyfungsi Anda tidak perlu. Yang perlu Anda lakukan adalah:

def onMessage(self, socket, message):
    if not self.users:
        socket.send("Nobody is online, please use REGISTER command" \
                    " in order to register into the server")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

sumber
7
@ Wajih tautan Anda tidak relevan: bool({False: False})masih dievaluasi untuk True. Tautan yang Anda berikan terkait dengan anymetode, yang tergantung pada kunci.
Ulysse BN
@ Wajih apa artinya itu?
Charlie Parker
2
Saya merasa 'tidak dict' tidak eksplisit
imbatman
setuju, saya merasa ingin menggunakan boolean dan not <dict>tidak begitu jelas juga
cryanbhu
130

Berikut adalah tiga cara Anda dapat memeriksa apakah dikte kosong. Saya lebih suka menggunakan cara pertama saja. Dua cara lainnya terlalu bertele-tele.

test_dict = {}

if not test_dict:
    print "Dict is Empty"


if not bool(test_dict):
    print "Dict is Empty"


if len(test_dict) == 0:
    print "Dict is Empty"
ganda
sumber
44
Huh ... semua orang suka menjadi "pythonic" dan menggunakan karakter paling sedikit untuk diketik. Pertama, kriteria lain adalah keterbacaan. Kedua, tes pertama dalam jawaban di atas benar tidak hanya jika dict ada dan kosong, tetapi juga jika test_dict adalah None. Jadi gunakan tes ini hanya ketika Anda tahu bahwa objek dict ada (atau ketika perbedaannya tidak masalah). Cara kedua juga memiliki perilaku itu. Hanya menggonggong cara ketiga jika test_dict adalah Tidak Ada.
Andreas Maier
1
@ AndreasMaier Persis juga perasaan saya. Juga, python diketik secara dinamis. Di dalam suatu fungsi, umum untuk memeriksa "jika x adalah kamus yang tidak kosong, maka lakukan ini; jika x adalah array numpy yang tidak kosong, maka lakukan itu". Maka kode pertama akan gagal pada if xsaat x adalah array numpy
jf328
1
@ Wajih tautan Anda masih tidak relevan di sini ... Lihat alasannya
Ulysse BN
1
Tidak membatalkan ini meskipun secara teknis benar karena masalah yang saya bagi. @AndreasMaier
Stunner
16
dict = {}
print(len(dict.keys()))

jika panjangnya nol berarti dict kosong

Achilles Ram Nakirekanti
sumber
3
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
DimaSan
1
len(dict.keys())setara denganlen(dict)
pdpAxis
@ pdpAxis Dalam nilai yang diberikannya, meskipun saya yakin pelaksanaannya dict.__len__mungkin sedikit lebih cepat. :)
Mateen Ulhaq
6

Cara-cara sederhana untuk memeriksa dict kosong adalah di bawah ini:

        a= {}

    1. if a == {}:
           print ('empty dict')
    2. if not a:
           print ('empty dict')

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.

Shagun Pruthi
sumber
1

Kamus dapat secara otomatis dilemparkan ke boolean yang mengevaluasi Falseuntuk kamus kosong dan kamus Truetidak kosong.

if myDictionary: non_empty_clause()
else: empty_clause()

Jika ini terlihat terlalu idiomatis, Anda juga dapat menguji len(myDictionary)nol, atau set(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.

  1. The return Falsepernyataan lebih menjorok satu tingkat terlalu dalam. Itu harus di luar for loop dan pada tingkat yang sama dengan forpernyataan. Akibatnya, kode Anda hanya akan memproses satu, kunci yang dipilih secara sewenang-wenang, jika ada kunci. Jika kunci tidak ada, fungsi akan kembali None, yang akan dilemparkan ke boolean False. Aduh! Semua kamus kosong akan diklasifikasikan sebagai false-nagatives.
  2. Jika kamus tidak kosong, maka kode hanya akan memproses satu kunci dan mengembalikan nilainya ke boolean. Anda bahkan tidak dapat berasumsi bahwa kunci yang sama dievaluasi setiap kali Anda menyebutnya. Jadi akan ada positif palsu.
  3. Katakanlah Anda mengoreksi lekukan return Falsepernyataan dan membawanya di luar forlingkaran. Maka yang Anda dapatkan adalah boolean ATAU semua kunci, atau Falsejika 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'}

Della
sumber
-1

Anda juga dapat menggunakan get (). Awalnya saya percaya hanya memeriksa apakah kunci ada.

>>> d = { 'a':1, 'b':2, 'c':{}}
>>> bool(d.get('c'))
False
>>> d['c']['e']=1
>>> bool(d.get('c'))
True

Yang saya suka dengan get adalah itu tidak memicu pengecualian, sehingga membuatnya mudah untuk melintasi struktur besar.

MortenB
sumber
-4

Mengapa tidak menggunakan tes kesetaraan?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")
wieczorek1990
sumber
Itu terlihat seperti kesalahan sintaksis, dan tidak menunjukkan cara menerapkan pemeriksaan dalam konteks pertanyaan.
Roland Weber
-7

gunakan 'apa saja'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty
chhotu sardar
sumber
4
anymemeriksa apakah dict berisi kunci kebenaran, mis. any({0: 'something'})mengembalikan Falsemeskipun dict tidak kosong
Railslide
ya itu untuk menyelamatkan dari kedua kasus, jujur ​​dan kosong, bool bijaksana lainnya akan memberikan yang benar untuk kasus kebenaran. jika Anda berpikir dalam tujuan pengkodean umum.
chhotu sardar