Hassan Baig
Hassan Baig

Reputation: 15804

Purging empty dictionaries from list of dictionary

I have a list of dictionaries like so:

[{'a':'21'},{},{'b':20'},{'c':'89'},{}]

What's the most efficient way to purge empty dictionaries from this list, end result being:

[{'a':'21'},{'b':'20'},{'c':'89'}]

I'm trying:

new_list_of_dictionaries = []
for dictionary in list_of_dictionaries:
    if dictionary:
        new_list_of_dictionaries.append(dictionary)
return new_list_of_dictionaries

I don't suppose this can be done in O(1) or something?

Upvotes: 0

Views: 105

Answers (4)

Omid Zarinmahd
Omid Zarinmahd

Reputation: 158

I did it in this way

d = [{'a': '21'}, {}, {'b': 20}, {'c': '89'}, {}]
new_d = []
for item in d:
    check = bool(item)
    if not check:
        del item
    else:
        new_d.append(item)

print(new_d)

[{'a': '21'}, {'b': 20}, {'c': '89'}]

Upvotes: -2

user2390182
user2390182

Reputation: 73450

Comprehension or filter (Python2, Python3):

return filter(None, list_of_dictionaries)

# Python3, if you prefer a list over an iterator
return list(filter(None, list_of_dictionaries))  

None as filter function will filter out all non-truthy elements, which in the case of empty collections makes it quite concise.

Upvotes: 4

Martijn Pieters
Martijn Pieters

Reputation: 1121148

Just use a list comprehension, and filter on the boolean truth. An empty dictionary is considered false:

return [d for d in list_of_dictionaries if d]

In Python 2, you could also use the filter() function, using None as the filter:

return filter(None, list_of_dictionaries)

In Python 3 that returns an iterator, not a list, so you'd have to call list() on that (so return list(filter(None, ...))), at which point the list comprehension is simply more readable. Of course, if you don't actually need to have random access to the result (so direct index access to result[whatever]), then an iterator might still be a good idea anyway.

Note that this has to take O(N) time, you have to test each and every dictionary. Even if lists had some kind of automaticly updated map that lets you get the indices of the dictionaries that are empty in O(1) time, removing items from a list requires moving later entries forward.

Upvotes: 6

RichSmith
RichSmith

Reputation: 940

could use a list comprehension?

myList = [{'a':'21'},{},{'b':'20'},{'c':'89'},{}]

result = [x for x in myList if x]

Upvotes: 3

Related Questions