Python: 'Sözlük'ün boş olup olmadığını kontrol etmek işe yaramıyor


396

Bir sözlüğün boş olup olmadığını kontrol etmeye çalışıyorum ama düzgün davranmıyor. Sadece atlar ve mesajı görüntülemek dışında hiçbir şey olmadan ONLINE görüntüler. Neden herhangi bir fikir?

 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())) 

6
self.usersBoş olup olmadığını kontrol etmek için yapın if self.users.
BrenBarn

4
Sizin isEmptyaslında döner Truesözlükten vermiştir ilk anahtar truey ve iadeler ise Falseaksi. Sözlük boşsa, Noneolmayan döndürür == False.
Hyperboreus

İf ifadeniz geriye dönük.
Mad Physicist

sahte tuşlara dikkat edin stackoverflow.com/a/17347421/1379762
Wajih

Yanıtlar:


737

Boş sözlükler Python'da şunları değerlendirirFalse :

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

Bu nedenle, isEmptyişleviniz gereksizdir. Tek yapmanız gereken:

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()))

7
@Wajih bağlantınız ilgisiz: bool({False: False})hala değerlendiriliyor True. Verdiğiniz bağlantı any, anahtarlara bağlı olan yönteme karşılık gelir .
Ulysse BN

@Wajih bu ne anlama geliyor?
Charlie Parker

2
'Dict' değil açık hissediyorum
imbatman

kabul etti, booleans kullanmak gibi hissediyorum ve not <dict>o kadar da net değil
cryanbhu

130

Burada, diktenin boş olup olmadığını kontrol etmenin üç yolu vardır. Sadece ilk yolu kullanmayı tercih ederim. Diğer iki yol çok garip.

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"

44
Ah ... herkes "pitonik" olmayı sever ve en az karakter yazması gerekir. İlk olarak, başka bir kriter okunabilirliktir. İkincisi, yukarıdaki cevaptaki ilk test sadece diksiyon mevcut ve boşsa değil, aynı zamanda test_dict Yok ise doğrudur. Bu testi yalnızca dikte nesnesinin var olduğunu bildiğinizde (veya fark önemli olmadığında) kullanın. İkinci yol da bu davranışa sahiptir. Test_dict Yok ise yalnızca üçüncü yol havlar.
Andreas Maier

1
@AndreasMaier Benim de duygularım. Ayrıca, python dinamik olarak yazılmıştır. Bir işlevin içinde "x boş olmayan bir sözlükse, bunu yapın; x boş olmayan bir numpy dizisiyse bunu yapın" seçeneğini işaretlemek yaygındır. Daha sonra if xx numpy dizisi olduğunda ilk kod başarısız olur
jf328

1
@Wajih bağlantı hala burada alakasız ... Nedenini
Ulysse BN

1
Paylaştığım kaygılar nedeniyle teknik olarak doğru olmasına rağmen bunu düzeltmiyor. @AndreasMaier
Stunner

16
dict = {}
print(len(dict.keys()))

uzunluk sıfırsa, diksamanın boş olduğu anlamına gelir


3
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
DimaSan

1
len(dict.keys())eşdeğerlen(dict)
pdpAxis

@pdpAxis Verdiği değerde, bahse girerim dict.__len__muhtemelen uygulaması biraz daha hızlıdır. :)
Mateen Ulhaq

6

Boş bir dikteyi kontrol etmenin basit yolları aşağıdadır:

        a= {}

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

Yöntem 1, a = Yok olduğu gibi daha katı olsa da, yöntem 1 doğru sonucu sağlayacaktır, ancak yöntem 2 yanlış sonuç verecektir.


1

Bir sözlük otomatik olarak boolean biçimine çevrilebilir; bu False, boş sözlük ve Trueboş olmayan sözlük için değerlendirilir .

if myDictionary: non_empty_clause()
else: empty_clause()

Bu çok deyimsel görünüyorsa, len(myDictionary)sıfır veya set(myDictionary.keys())boş bir küme için test edebilir veya sadece eşitliği test edebilirsiniz {}.

İsEmpty işlevi yalnızca gereksiz değil, aynı zamanda uygulamanızın prima-facie'yi tespit edebileceğim birden fazla sorunu var.

  1. return Falseİfadesi çok derin bir seviye girintilendirilmiştir. For döngüsünün dışında ve deyimle aynı düzeyde olmalıdır for. Sonuç olarak, bir anahtar varsa kodunuz isteğe bağlı olarak seçilen yalnızca bir anahtarı işleyecektir. Bir anahtar yoksa, işlev Noneboole False değerine dönüştürülecek şekilde geri döner . Ah! Tüm boş sözlükler yanlış negatif olarak sınıflandırılacaktır.
  2. Sözlük boş değilse, kod yalnızca bir anahtarı işleyecek ve değerinin boole değerine döndürülecektir. Her aradığınızda aynı anahtarın değerlendirildiğini bile düşünemezsiniz. Yani yanlış pozitifler olacak.
  3. Diyelim ki return Falseifadenin girintisini düzeltin ve onu fordöngü dışına getirin . Sonra ne olsun tüm anahtarların boole OR veya Falsesözlük boş. Yine de yanlış pozitif ve yanlış negatifleriniz olacaktır. Düzeltmeyi yapın ve kanıt için aşağıdaki sözlüğe karşı test edin.

myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}


-1

Ayrıca get () işlevini de kullanabilirsiniz. Başlangıçta sadece anahtarın var olup olmadığını kontrol etmeye inandım.

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

Get ile sevdiğim şey, bir istisna tetiklememesi, bu nedenle büyük yapıların geçişini kolaylaştırıyor.


-4

Neden eşitlik testi kullanılmıyor?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")

Bu bir sözdizimi hatası gibi görünür ve sorunun bağlamında denetimin nasıl uygulanacağını göstermez.
Roland Weber

-7

'herhangi birini' kullan

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anybu diktenin herhangi bir doğru anahtar içerip içermediğini kontrol eder, örneğin any({0: 'something'})False
dik

evet, her iki durumdan da, doğruluk ve boştan kurtulmak için, diğer bilge bool, doğruluk davası için doğrudur. genel olarak kodlama amacını düşünüyorsanız.
chhotu sardar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.