Wie überprüfe ich, ob ein Wörterbuch leer ist?

Lesezeit: 6 Minuten

Benutzeravatar von Unsparing
Schonungslos

Ich versuche zu überprüfen, ob ein Wörterbuch leer ist, aber es verhält sich nicht richtig. Es überspringt es einfach und zeigt es an ONLINE ohne etwas anderes als die Anzeige der Nachricht. 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()))    

  • Um zu prüfen, ob self.users ist nicht leer, tun Sie es einfach if self.users.

    – BrenBarn

    20. April 2014 um 1:31 Uhr

  • Dein isEmpty kehrt tatsächlich zurück True wenn der erste aus dem Wörterbuch gelieferte Schlüssel wahr ist und zurückkehrt False Andernfalls. Wenn das Wörterbuch leer ist, kehrt es zurück None was nicht ist == False.

    – Hyperboreus

    20. April 2014 um 2:08 Uhr


  • Ihre if-Anweisung ist rückwärts.

    – Verrückter Physiker

    21. April 2015 um 3:55 Uhr

  • Achten Sie auf falsche Schlüssel stackoverflow.com/a/17347421/1379762

    – Wajih

    6. Februar 2016 um 19:20 Uhr

  • Mögliches Duplikat von Python: Effiziente Methode, um zu überprüfen, ob das Wörterbuch leer ist oder nicht

    – Dreier

    21. April 2016 um 6:12 Uhr

Leere Wörterbücher auswerten zu False in Python:

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

Also, Ihr isEmpty Funktion unnötig. 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()))

  • @Wajih Ihr Link ist irrelevant: bool({False: False})wertet immer noch zu True. Der von Ihnen angegebene Link entspricht anyMethode, die von Schlüsseln abhängt.

    – Ulysse BN

    17. Februar 2017 um 20:38 Uhr

  • @ Wajih was bedeutet das?

    – Charly Parker

    12. September 2017 um 18:37 Uhr

  • Ich denke, “nicht diktieren” ist nicht explizit

    – ich bin Batman

    9. Januar 2019 um 13:03 Uhr

  • einverstanden, ich habe Lust, die booleschen Werte und zu verwenden not <dict> ist auch nicht so klar

    – kryanbhu

    28. Mai 2019 um 2:07 Uhr

  • “Ihre isEmpty-Funktion ist unnötig” Es macht den Code leichter verständlich.

    – GG.

    23. März 2021 um 21:21 Uhr


Hier sind drei Möglichkeiten, wie Sie überprüfen können, ob dict leer ist. Ich ziehe es jedoch vor, nur den ersten Weg zu verwenden. 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"

  • Seufz … jeder mag es, “pythonisch” zu sein und versucht, die wenigsten Zeichen zu tippen. Erstens ist ein weiteres Kriterium 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 dict-Objekt existiert (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

    12. Dezember 2016 um 19:37 Uhr


  • @AndreasMaier Genau mein Gefühl auch. Außerdem ist Python dynamisch typisiert. Innerhalb einer Funktion ist es üblich zu überprüfen “wenn x ein nicht leeres Wörterbuch ist, dann tue dies; wenn x ein nicht leeres numpy-Array ist, dann tue das”. Dann schlägt der erste Code fehl if x wenn x ein numpy-Array ist

    – jf328

    15. Dezember 2016 um 8:36 Uhr


  • @Wajih Ihr Link ist hier immer noch irrelevant … Sehen Sie warum

    – Ulysse BN

    17. Februar 2017 um 20:44 Uhr

  • Ich stimme dem nicht zu, obwohl es technisch korrekt ist, da ich Bedenken habe, mit denen ich teile. @Andreas Maier

    – Wahnsinn

    17. Dezember 2018 um 23:36 Uhr

Benutzeravatar von Achilles Ram Nakirekanti
Achilles Ram Nakirekanti

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

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

  • Dieses Code-Snippet kann zwar die Frage lösen, inklusive Erklärung hilft wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für zukünftige Leser beantworten und diese Personen die Gründe für Ihren Codevorschlag möglicherweise nicht kennen.

    – Dimasan

    16. Dezember 2016 um 11:43 Uhr

  • len(dict.keys()) ist äquivalent zu len(dict)

    – pdpAxis

    4. Juni 2020 um 18:45 Uhr


  • @pdpAxis In dem Wert, den es gibt, obwohl ich auf die Implementierung wette dict.__len__ ist wohl etwas schneller. 🙂

    – Mateen Ulhaq

    11. Juni 2020 um 2:21 Uhr

Benutzeravatar von Shagun Pruthi
Schagun Pruthi

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

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

Methode 1 ist strenger, denn wann a = Noneliefert Methode 1 das richtige Ergebnis, Methode 2 jedoch ein falsches Ergebnis.

Benutzeravatar von Della
Della

Ein Wörterbuch kann automatisch in einen booleschen Wert umgewandelt werden, der zu ausgewertet wird False für leeres Wörterbuch und True für nicht leeres Wörterbuch.

if myDictionary: non_empty_clause()
else: empty_clause()

Wem das zu idiomatisch erscheint, der kann auch testen len(myDictionary) für null bzw set(myDictionary.keys()) für eine leere Menge oder testen Sie einfach auf Gleichheit mit {}.

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

  1. Die return False Anweisung ist eine Ebene zu tief eingerückt. Sie sollte sich außerhalb der for-Schleife und auf der gleichen Ebene wie die befinden for Aussage. Dadurch verarbeitet Ihr Code nur einen willkürlich ausgewählten Schlüssel, falls ein Schlüssel vorhanden ist. Wenn kein Schlüssel vorhanden ist, kehrt die Funktion zurück None, der in den booleschen Wert False umgewandelt wird. Autsch! Alle leeren Wörterbücher werden als falsch-nagative klassifiziert.
  2. Wenn das Wörterbuch nicht leer ist, verarbeitet der Code nur einen Schlüssel und gibt seinen Wert in einen booleschen Wert 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. Nehmen wir an, Sie korrigieren den Einzug des return False Anweisung und bringen Sie es außerhalb der for Schleife. Was Sie dann erhalten, ist der boolesche Wert ODER aller Schlüssel, oder False wenn das Wörterbuch leer ist. Trotzdem werden Sie falsch positive und falsch negative Ergebnisse haben. Führen Sie die Korrektur durch und testen Sie anhand des folgenden Wörterbuchs, um einen Beweis zu erhalten.

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

Benutzeravatar von Gino Mempin
Gino Mempin

1. Weg

len(given_dic_obj) 

Es gibt 0 zurück, wenn keine Elemente vorhanden sind. Andernfalls wird die Größe des Wörterbuchs zurückgegeben.

2. Weg

bool(given_dic_object)

Kehrt zurück False Wenn das Wörterbuch leer ist, geben Sie andernfalls True zurück.

Benutzeravatar von MortenB
MortenB

Sie können auch get() verwenden. Anfangs glaubte ich, es würde nur prüfen, ob der Schlüssel vorhanden ist.

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

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

1440700cookie-checkWie überprüfe ich, ob ein Wörterbuch leer ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy