Python tutorials > Data Structures > Dictionaries > How to merge dictionaries?

How to merge dictionaries?

Dictionaries are a fundamental data structure in Python, used to store key-value pairs. Merging dictionaries is a common operation. This tutorial explores different methods for merging dictionaries in Python, highlighting their advantages and disadvantages.

Merging Dictionaries Using the update() Method

The update() method modifies the original dictionary by adding the key-value pairs from the second dictionary. If a key exists in both dictionaries, the value from the second dictionary overwrites the value in the first dictionary.

Note: The update() method modifies the original dictionary in place. If you want to create a new dictionary without modifying the original ones, consider other methods described below.

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

dict1.update(dict2)

print(dict1)  # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Merging Dictionaries Using the | Operator (Python 3.9+)

Python 3.9 introduced the | operator for merging dictionaries. This operator creates a new dictionary containing the merged key-value pairs. If a key exists in both dictionaries, the value from the right-hand dictionary takes precedence.

The |= operator updates a dictionary in place by merging another dictionary into it.

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

merged_dict = dict1 | dict2

print(merged_dict)  # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

#If you want to update an existing dictionary
dict1 |= dict2
print(dict1) # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Merging Dictionaries Using Double Asterisk ** (Dictionary Unpacking)

The double asterisk (**) operator unpacks the dictionaries into key-value pairs, which are then used to create a new dictionary. If a key exists in both dictionaries, the value from the rightmost dictionary takes precedence.

This method is compatible with older Python versions (Python 3.5+).

dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}

merged_dict = {**dict1, **dict2}

print(merged_dict)  # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Concepts Behind the Snippet

Merging dictionaries involves combining two or more dictionaries into a single dictionary. The core concept revolves around handling key collisions - situations where the same key exists in multiple dictionaries. Different methods prioritize different dictionaries in these collisions.

Understanding dictionary unpacking and the behavior of the update() method are crucial for efficient dictionary manipulation.

Real-Life Use Case Section

A common use case is merging configuration settings. Imagine you have default configuration options in one dictionary and user-specific overrides in another. Merging these dictionaries allows you to create a single configuration dictionary with user-specific settings taking precedence.

Another example: processing data from multiple sources. You might receive data from different APIs, each represented as a dictionary. Merging these dictionaries allows you to combine all the data into a single, easily accessible structure.

Best Practices

Consider the order of dictionaries when merging, as the order determines which value will be kept in case of key collisions.

Choose the appropriate method based on whether you need to modify the original dictionaries or create a new one.

For Python 3.9+, the | operator is generally preferred for its readability and conciseness.

Interview Tip

Be prepared to discuss the different methods for merging dictionaries and their respective advantages and disadvantages. Understand the implications of modifying dictionaries in place vs. creating new dictionaries.

Mention the performance characteristics of each method (e.g., update() modifies in-place, which can be faster in some cases).

When to use them

  • update(): Use when you need to modify an existing dictionary in place and don't need to preserve the original dictionaries.
  • | operator: Use when you want to create a new, merged dictionary without modifying the originals (Python 3.9+).
  • ** operator: Use when you want to create a new, merged dictionary and need compatibility with older Python versions (Python 3.5+).

Memory footprint

The update() method has a smaller memory footprint compared to the | and ** operators because it modifies the dictionary in place instead of creating a new one. The | and ** operators, create a new dictionary, which requires additional memory.

Alternatives

While the methods outlined above are the most common, you could also merge dictionaries using a loop. However, this is generally less efficient and less readable than using the built-in methods or operators.

Example of using a loop:

merged_dict = dict1.copy() for key, value in dict2.items(): merged_dict[key] = value

Pros

  • update(): Modifies in-place, potentially faster for large dictionaries.
  • | operator: Concise and readable (Python 3.9+). Creates a new dictionary, preserving the original.
  • ** operator: Works in older Python versions (3.5+). Creates a new dictionary, preserving the original.

Cons

  • update(): Modifies the original dictionary, which might not be desirable.
  • | operator: Only available in Python 3.9+.
  • ** operator: Can be slightly less readable than the | operator.

FAQ

  • What happens if the same key exists in both dictionaries?

    The value from the right-hand dictionary (the dictionary being merged into the first) overwrites the value in the left-hand dictionary.

  • Which method is the most efficient?

    The update() method is generally the most efficient because it modifies the dictionary in place. However, it also modifies the original dictionary, which might not always be what you want. The | operator (Python 3.9+) is usually the preferred approach for creating new dictionaries due to its readability and efficiency.

  • Can I merge more than two dictionaries at once?

    Yes, using the | or ** operator. For example, merged_dict = dict1 | dict2 | dict3 or merged_dict = {**dict1, **dict2, **dict3}.