738

I am trying to check if a dictionary is empty but it doesn't behave properly. It just skips it and displays ONLINE without anything aside from the display the message. Any ideas why ?

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())) 
7
  • 8
    To check if self.users is nonempty, just do if self.users. Commented Apr 20, 2014 at 1:31
  • 4
    Your isEmpty actually returns True if the first key yielded from the dictionary is truey and returns False otherwise. If the dictionary is empty, it returns None which is not == False. Commented Apr 20, 2014 at 2:08
  • Your if statement is backwards. Commented Apr 21, 2015 at 3:55
  • be careful to false-like keys stackoverflow.com/a/17347421/1379762 Commented Feb 6, 2016 at 19:20
  • Possible duplicate of Python:Efficient way to check if dictionary is empty or not Commented Apr 21, 2016 at 6:12

8 Answers 8

1274

Empty dictionaries evaluate to False in Python:

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

Thus, your isEmpty function is unnecessary. All you need to do is:

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())) 
Sign up to request clarification or add additional context in comments.

8 Comments

@Wajih you link is irrelevant: bool({False: False})still evaluates to True. The link you gave correspond to anymethod, which depends on keys.
@Wajih what does that mean?
I feel 'not dict' is not explicit
agreed, I feel like using the booleans and not <dict> is not that clear too
"your isEmpty function is unnecessary" It makes code easier to understand tho.
|
258

Here are three ways you can check if dict is empty. I prefer using the first way only though. The other two ways are way too wordy.

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" 

5 Comments

Sigh ... everybody likes to be "pythonic" and goes for the least characters to type. First, another criteria is readability. Second, the first test in the answer above is true not only if the dict exists and is empty, but also if test_dict is None. So use this test only when you know that the dict object exists (or when the difference does not matter). The second way also has that behavior. Only the third way barks if test_dict is None.
@AndreasMaier Exactly my feeling as well. Also, python is dynamically typed. Inside a function it's common to check "if x is non-empty dictionary, then do this; if x is non-empty numpy array, then do that". Then the first code will fail on if x when x is numpy array
@Wajih you link is still irrelevant here... See why
Not upvoting this although technically correct due to concerns I share with. @AndreasMaier
@AndreasMaier and the pythonic way to solve this is to add if test_dict is not None: print("Dict is None") at the beginning
47

Simple ways to check an empty dict are below:

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

Method 1 is more strict, because when a = None, method 1 will provide the correct result, but method 2 will give an incorrect result.

1 Comment

This should be the accepted answer as it is the only answer differentiating between empty dict's and anything evaluating to None.
41
d = {} print(len(d.keys())) 

If the length is zero, it means that the dict is empty.

4 Comments

While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.
len(dict.keys()) is equivalent to len(dict)
@pdpAxis In the value it gives, though I bet the implementation of dict.__len__ is probably a bit faster. :)
len(dict.keys()) is NOT equivalent to len(dict). The first case fails on lists and tuples, the second not. So, the first statement is more explicit.
10

A dictionary can be automatically cast to boolean which evaluates to False for empty dictionary and True for non-empty dictionary.

if myDictionary: non_empty_clause() else: empty_clause() 

If this looks too idiomatic, you can also test len(myDictionary) for zero, or set(myDictionary.keys()) for an empty set, or simply test for equality with {}.

The isEmpty function is not only unnecessary but also your implementation has multiple issues that I can spot prima-facie.

  1. The return False statement is indented one level too deep. It should be outside the for loop and at the same level as the for statement. As a result, your code will process only one, arbitrarily selected key, if a key exists. If a key does not exist, the function will return None, which will be cast to boolean False. Ouch! All the empty dictionaries will be classified as false-nagatives.
  2. If the dictionary is not empty, then the code will process only one key and return its value cast to boolean. You cannot even assume that the same key is evaluated each time you call it. So there will be false positives.
  3. Let us say you correct the indentation of the return False statement and bring it outside the for loop. Then what you get is the boolean OR of all the keys, or False if the dictionary empty. Still you will have false positives and false negatives. Do the correction and test against the following dictionary for an evidence.

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

Comments

8

1st Way

len(given_dic_obj) 

It returns 0 if there are no elements. Else, returns the size of the dictionary.

2nd Way

bool(given_dic_object) 

Returns False if the dictionary is empty, else return True.

2 Comments

You have this the wrong way round - bool(given_dic_object) returns False if the dictionary is empty
@andy: haven't I mentioned the same thing.
0

You can also use get(). Initially I believed it to only check if key existed.

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

What I like with get is that it does not trigger an exception, so it makes it easy to traverse large structures.

Comments

-9

use 'any'

dict = {} if any(dict) : # true # dictionary is not empty else : # false # dictionary is empty 

2 Comments

any checks if the dict contains any truthy key, e.g. any({0: 'something'}) returns False even though the dict is not empty
yeah that to save from both cases , truthy and blank, other wise bool would have given true for truthy case . if you think in general coding purpose .

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.