Skip to main content

How to Remove Dictionaries from Lists of Dictionaries in Python

Manipulating lists containing dictionaries is a common task in Python.

This guide explores various methods for removing dictionaries from a list of dictionaries based on specific criteria, including removing specific dictionaries, removing empty dictionaries, and handling potential pitfalls during iteration. We'll cover techniques using list comprehensions, filter(), and for loops.

Removing Specific Dictionaries Based on Value

To remove dictionaries from a list where a certain key has a specific value (or one of multiple values).

List comprehensions provide a concise and readable way to create a new list containing only the dictionaries that don't match the criteria:

my_list = [
{'id': 1, 'fruit': 'apple'},
{'id': 2, 'fruit': 'banana'},
{'id': 3, 'fruit': 'kiwi'},
]

# Remove dictionaries where 'id' is 2
new_list = [item for item in my_list if item.get('id') != 2]
print(new_list)
# Output: [{'id': 1, 'fruit': 'apple'}, {'id': 3, 'fruit': 'kiwi'}]

# Remove dictionaries where 'id' is 1 OR 3
ids_to_remove = {1, 3} # Use a set for efficient lookup
new_list_multi = [item for item in my_list if item.get('id') not in ids_to_remove]
print(new_list_multi)
# Output: [{'id': 2, 'fruit': 'banana'}]
  • item.get('id') safely accesses the 'id' key (returns None if the key doesn't exist, preventing KeyError).
  • The comprehension builds a new list, leaving the original my_list unchanged.

Using filter()

The filter() function offers an alternative functional approach:

my_list = [
{'id': 1, 'fruit': 'apple'},
{'id': 2, 'fruit': 'banana'},
{'id': 3, 'fruit': 'kiwi'},
]

# Remove dictionaries where 'id' is 2
new_list = list(filter(lambda d: d.get('id') != 2, my_list))
print(new_list)
# Output: [{'id': 1, 'fruit': 'apple'}, {'id': 3, 'fruit': 'kiwi'}]
  • filter() creates an iterator; list() converts it back to a list.
  • The lambda function defines the filtering condition.

Using a for Loop (Modifying In-Place)

If you need to modify the original list, iterate over a copy of it while removing items from the original:

my_list = [
{'id': 1, 'fruit': 'apple'},
{'id': 2, 'fruit': 'banana'},
{'id': 3, 'fruit': 'kiwi'},
]

id_to_remove = 2

for item in my_list.copy(): # Iterate over a shallow copy
if item.get('id') == id_to_remove:
my_list.remove(item) # Remove from the original list
# break # Optional: Exit loop if you only expect one match

print(my_list)
# Output: [{'id': 1, 'fruit': 'apple'}, {'id': 3, 'fruit': 'kiwi'}]
warning

Crucial: Never modify a list while iterating directly over it (e.g., for item in my_list:). This can lead to skipped items and unexpected behavior. Always iterate over a copy (my_list.copy() or my_list[:]) when removing from the original list within the loop.

Removing Empty Dictionaries

Empty dictionaries ({}) are considered "falsy" in Python. You can leverage this to filter them out.

This is the most concise way to create a new list without empty dictionaries:

list_of_dicts = [{'id': 1}, {}, {'id': 2}, {}, {'id': 3}]
new_list = [item for item in list_of_dicts if item] # Keep only truthy items
print(new_list) # Output: [{'id': 1}, {'id': 2}, {'id': 3}]
  • The if item condition implicitly checks if the dictionary is truthy (i.e., not empty).

Using filter(None, ...)

filter(None, ...) filters out all falsy values, including empty dictionaries:

list_of_dicts = [{'id': 1}, {}, {'id': 2}, {}, {'id': 3}]
new_list = list(filter(None, list_of_dicts))
print(new_list) # Output: [{'id': 1}, {'id': 2}, {'id': 3}]

Using a for Loop (Modifying In-Place)

Again, iterate over a copy if modifying the original list:

list_of_dicts = [{'id': 1}, {}, {'id': 2}, {}, {'id': 3}]
for item in list_of_dicts.copy(): # Iterate over a copy
if item == {}: # Explicitly check for empty dictionary
list_of_dicts.remove(item) # Remove from original
print(list_of_dicts) # Output: [{'id': 1}, {'id': 2}, {'id': 3}]

Important Note: Modifying vs. Creating New Lists

  • List comprehensions and filter() create new lists, leaving the original list unchanged.
  • Using a for loop with .remove() modifies the original list in-place.
  • Assigning back to a slice (my_list[:] = ...) also modifies the original list in-place.

Choose the approach based on whether you need to preserve the original list. Creating new lists is often safer and easier to reason about.

Conclusion

This guide presented various methods for removing dictionaries from a list of dictionaries in Python. List comprehensions provide a concise and readable way to create new filtered lists.

  • The filter() function offers a functional alternative.
  • For in-place modification, iterate over a copy of the list while using list.remove() on the original.
  • Understanding the difference between these approaches and the importance of iterating over copies when modifying in-place is crucial for writing correct and predictable code.