39
votes

How to check if dictionary is empty or not? more specifically, my program starts with some key in dictionary and I have a loop which iterates till there are key in dictionary. Overall algo is like this:

Start with some key in dict
while there is key in dict
do some operation on first key in dict
remove first key

Please note that some operation in above loop may add new keys to dictionary. I've tried for key,value in d.iteritems()

but it is failing as during while loop some new key are added.

7
if dict should check for emptiness.squiguy
What are you really trying to do? What is the algorithm for, what's in the dict?Karl Knechtel
A normal dict is just a hashtable and has no concept of order, 'first' is meaningless. You could use OrderedDict instead if you need this behaviour.Ed Randall

7 Answers

44
votes

any(d)

This will return true if the dict. d contains at least one truelike key, false otherwise.

Example:

any({0:'test'}) == False

another (more general) way is to check the number of items:

len(d)

17
votes

I just wanted to know if the dictionary i was going to try to pull data from had data in it in the first place, this seems to be simplest way.

d = {}

bool(d)

#should return
False

d = {'hello':'world'}

bool(d)

#should return
True
17
votes

Just check the dictionary:

d = {'hello':'world'}
if d:
  print 'not empty'
else:
  print 'empty'

d = {}
if d:
  print 'not empty'
else:
  print 'empty'
15
votes

This will do it:

while d:
    k, v = d.popitem()
    # now use k and v ...

A dictionary in boolean context is False if empty, True otherwise.

There is no "first" item in a dictionary, because dictionaries aren't ordered. But popitem will remove and return some item for you each time.

8
votes

I would say that way is more pythonic and fits on line:

If you need to check value only with the use of your function:

if filter( your_function, dictionary.values() ): ...

When you need to know if your dict contains any keys:

if dictionary: ...

Anyway, using loops here is not Python-way.

2
votes

As far as I know the for loop uses the iter function and you should not mess with a structure while iterating over it.

Does it have to be a dictionary? If you use a list something like this might work:

while len(my_list) > 0:
    #get last item from list
    key, value = my_list.pop()
    #do something with key and value
    #maybe
    my_list.append((key, value))

Note that my_list is a list of the tuple (key, value). The only disadvantage is that you cannot access by key.

EDIT: Nevermind, the answer above is mostly the same.

1
votes

Here is another way to do it:

isempty = (dict1 and True) or False

if dict1 is empty then dict1 and True will give {} and this when resolved with False gives False.

if dict1 is non-empty then dict1 and True gives True and this resolved with False gives True