Python: Es scheint nicht zu funktionieren, zu überprüfen, ob ein 'Wörterbuch' leer ist

396

Ich versuche zu überprüfen, ob ein Wörterbuch leer ist, aber es verhält sich nicht richtig. Es überspringt es einfach und zeigt ONLINE an, ohne die Nachricht anzuzeigen. Irgendwelche Ideen warum?

 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())) 
Schonungslos
quelle
6
Um zu überprüfen, ob dies self.usersnicht leer ist, tun Sie es einfach if self.users.
BrenBarn
4
Sie isEmptykehren tatsächlich zurück, Truewenn der erste aus dem Wörterbuch ermittelte Schlüssel wahr ist, und geben Falseandernfalls zurück. Wenn das Wörterbuch leer ist, wird zurückgegeben, Nonewas nicht der Fall ist == False.
Hyperboreus
Ihre if-Anweisung ist rückwärts.
Verrückter Physiker
Seien
Sie

Antworten:

737

Leere Wörterbücher werdenFalse in Python ausgewertet :

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

Somit ist Ihre isEmptyFunktion nicht erforderlich. Alles was Sie tun müssen ist:

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

quelle
7
@Wajih Sie Link ist irrelevant: bool({False: False})noch zu bewerten True. Der von Ihnen angegebene Link entspricht der anyMethode, die von den Schlüsseln abhängt.
Ulysse BN
@ Wajih was bedeutet das?
Charlie Parker
2
Ich
denke
stimmte zu, ich habe Lust auf die Booleschen Werte und bin auch not <dict>nicht so klar
cryanbhu
130

Hier sind drei Möglichkeiten, wie Sie überprüfen können, ob das Diktat leer ist. Ich bevorzuge jedoch nur den ersten Weg. Die anderen beiden Wege sind viel zu wortreich.

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"
doubleo
quelle
44
Seufz ... jeder mag es "pythonisch" zu sein und versucht, die wenigsten Zeichen zu tippen. Ein weiteres Kriterium ist die Lesbarkeit. Zweitens ist der erste Test in der obigen Antwort nicht nur wahr, wenn das Diktat existiert und leer ist, sondern auch, wenn test_dict None ist. Verwenden Sie diesen Test also nur, wenn Sie wissen, dass das Diktierobjekt vorhanden ist (oder wenn der Unterschied keine Rolle spielt). Der zweite Weg hat auch dieses Verhalten. Nur der dritte Weg bellt, wenn test_dict None ist.
Andreas Maier
1
@AndreasMaier Genau mein Gefühl auch. Außerdem wird Python dynamisch typisiert. In einer Funktion wird häufig überprüft, ob x ein nicht leeres Wörterbuch ist. Führen Sie dies aus. Wenn x ein nicht leeres numpy-Array ist, tun Sie dies. Dann if xschlägt der erste Code fehl, wenn x ein numpy-Array ist
jf328
1
@ Wajih Sie Link ist hier immer noch irrelevant ... Sehen Sie warum
Ulysse BN
1
Ich stimme dem nicht zu, obwohl es technisch korrekt ist, weil ich Bedenken habe. @ AndreasMaier
Stunner
16
dict = {}
print(len(dict.keys()))

Wenn die Länge Null ist, bedeutet dies, dass das Diktat leer ist

Achilles Ram Nakirekanti
quelle
3
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
DimaSan
1
len(dict.keys())entsprichtlen(dict)
pdpAxis
@pdpAxis In dem Wert, den es gibt, obwohl ich wette, dass die Implementierung von dict.__len__wahrscheinlich etwas schneller ist. :)
Mateen Ulhaq
6

Im Folgenden finden Sie einfache Möglichkeiten, ein leeres Diktat zu überprüfen:

        a= {}

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

Obwohl Methode 1 strenger ist als wenn a = Keine, liefert Methode 1 das richtige Ergebnis, Methode 2 liefert jedoch ein falsches Ergebnis.

Shagun Pruthi
quelle
1

Ein Wörterbuch kann automatisch in einen Booleschen Wert umgewandelt werden, der Falsefür ein leeres Wörterbuch und Truefür ein nicht leeres Wörterbuch ausgewertet wird .

if myDictionary: non_empty_clause()
else: empty_clause()

Wenn dies zu idiomatisch aussieht, können Sie auch len(myDictionary)auf Null oder set(myDictionary.keys())eine leere Menge testen oder einfach auf Gleichheit mit testen {}.

Die isEmpty-Funktion ist nicht nur unnötig, sondern Ihre Implementierung weist auch mehrere Probleme auf, die ich auf den ersten Blick erkennen kann.

  1. Die return FalseAussage ist eine Ebene zu tief eingerückt. Es sollte sich außerhalb der for-Schleife befinden und auf derselben Ebene wie die forAnweisung liegen. Infolgedessen verarbeitet Ihr Code nur einen willkürlich ausgewählten Schlüssel, wenn ein Schlüssel vorhanden ist. Wenn kein Schlüssel vorhanden ist, wird die Funktion zurückgegeben None, die in boolean False umgewandelt wird. Autsch! Alle leeren Wörterbücher werden als falsch-nagativ eingestuft.
  2. Wenn das Wörterbuch nicht leer ist, verarbeitet der Code nur einen Schlüssel und gibt seinen Wert an boolean zurück. Sie können nicht einmal davon ausgehen, dass bei jedem Aufruf derselbe Schlüssel ausgewertet wird. Es wird also falsch positive Ergebnisse geben.
  3. Angenommen, Sie korrigieren den Einzug der return FalseAnweisung und bringen ihn außerhalb der forSchleife. Dann erhalten Sie das boolesche ODER aller Schlüssel oder Falsewenn das Wörterbuch leer ist. Trotzdem werden Sie falsch positive und falsch negative Ergebnisse haben. Führen Sie die Korrektur durch und testen Sie sie anhand des folgenden Wörterbuchs, um Beweise zu erhalten.

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

Della
quelle
-1

Sie können auch get () verwenden. Anfangs glaubte ich, nur zu prüfen, ob der Schlüssel existiert.

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

Was ich mit get mag, ist, dass es keine Ausnahme auslöst, so dass es einfach ist, große Strukturen zu durchqueren.

MortenB
quelle
-4

Warum nicht den Gleichstellungstest verwenden?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")
wieczorek1990
quelle
Das sieht aus wie ein Syntaxfehler und zeigt nicht, wie die Prüfung im Kontext der Frage angewendet wird.
Roland Weber
-7

benutze 'any'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty
Chhotu Sardar
quelle
4
anyprüft, ob das Diktat einen wahrheitsgemäßen Schlüssel enthält, z. B. any({0: 'something'})kehrt zurück False, obwohl das Diktat nicht leer ist
Railslide
Ja, um aus beiden Fällen, wahrheitsgemäß und leer, zu retten, hätte ein anderer weiser Bool für wahrheitsgemäße Fälle wahr gegeben. wenn Sie im allgemeinen Codierungszweck denken.
Chhotu Sardar