685 Stimmen

Wie überprüft man, ob ein Wörterbuch leer ist?

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 etwas anderes neben der Anzeige der 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("Niemand ist online, bitte benutzen Sie den Befehl REGISTER" \
                 " um sich beim Server zu registrieren")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

1186voto

Leere Wörterbücher werden in Python als Falsch ausgewertet:

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

Somit ist Ihre isEmpty-Funktion überflüssig. Alles, was Sie tun müssen, ist:

def onMessage(self, socket, message):
    if not self.users:
        socket.send("Niemand ist online, bitte verwenden Sie den REGISTER-Befehl" \
                    " um sich am Server anzumelden")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

224voto

doubleo Punkte 4249

Hier sind drei Möglichkeiten, wie Sie überprüfen können, ob das Dictionary leer ist. Ich bevorzuge jedoch nur die erste Methode. Die anderen beiden Möglichkeiten sind viel zu umständlich.

test_dict = {}

if not test_dict:
    print "Dictionary ist leer"

if not bool(test_dict):
    print "Dictionary ist leer"

if len(test_dict) == 0:
    print "Dictionary ist leer"

36voto

d = {}
print(len(d.keys()))

Wenn die Länge null ist, bedeutet das, dass das Dictionary leer ist.

27voto

Shagun Pruthi Punkte 1613

Einfache Möglichkeiten, um ein leeres Wörterbuch zu überprüfen, sind unten aufgeführt:

a = {}
  1. if a == {}: print ('leeres Wörterbuch')

  2. if not a: print ('leeres Wörterbuch')

Methode 1 ist strenger, denn wenn a = None ist, wird Methode 1 das korrekte Ergebnis liefern, während Methode 2 ein inkorrektes Ergebnis liefern wird.

9voto

Della Punkte 1350

Ein Wörterbuch kann automatisch in ein Boolean umgewandelt werden, das in False für ein leeres Wörterbuch und in True fü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 testen oder set(myDictionary.keys()) für eine leere Menge oder einfach auf Gleichheit mit {} testen.

Die isEmpty-Funktion ist nicht nur unnötig, sondern Ihre Implementierung hat auch mehrere offensichtliche Probleme, die ich erkennen kann.

  1. Die Anweisung return False ist um eine Ebene zu tief eingerückt. Sie sollte außerhalb der Schleife und auf der gleichen Ebene wie die for-Anweisung sein. Als Ergebnis wird Ihr Code nur einen willkürlich ausgewählten Schlüssel verarbeiten, wenn ein Schlüssel existiert. Wenn ein Schlüssel nicht existiert, gibt die Funktion None zurück, was in das boolean False umgewandelt wird. Autsch! Alle leeren Wörterbücher werden als Fehlinformationen klassifiziert.
  2. Wenn das Wörterbuch nicht leer ist, wird der Code nur einen Schlüssel verarbeiten und dessen Wert als Boolean zurückgeben. Sie können nicht einmal davon ausgehen, dass derselbe Schlüssel bei jedem Aufruf evaluiert wird. Es wird also falsche positive Ergebnisse geben.
  3. Angenommen, Sie korrigieren die Einrückung der Anweisung return False und bringen sie außerhalb der for-Schleife. Was Sie dann erhalten, ist das Boolean-ODER aller Schlüssel oder False, wenn das Wörterbuch leer ist. Selbst dann haben Sie falsche positive und falsche negative Ergebnisse. Führen Sie die Korrektur durch und testen Sie gegen das folgende Wörterbuch als Nachweis.

myDictionary={0:'null', '':'Leerer String', None:'None Wert', False:'Boolean False Wert', ():'Leeres Tuple'}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X