#Day7 - Dictionaries in Python
Tags: python, programming, 100daysofcode, codenewbie
Published: 2021-03-28 02:48:00

Today we will be talking about some advanced concepts of Dictionaries in Python. Dictionaries are essentially a Hashmap in Python and have a lookup time of O(1)


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616892956725/L1vfxsWWh.png)

The dictionary **dict_10** has 10 elements and the dictionary has **dict_100000** has 100000 elements. Both the if statements check if an element is a member of the dictionary but irrespective of the size of the dictionary size, the time taken is almost the same (It's in nanoseconds)

### Keys
An object can be a key of a dictionary if and only if it's hashable. As I discussed in my previous article (Day 5), only String, Boolean, Integer, Float, Tuples, and frozen Sets are hashable while lists, sets, and dictionaries are not hashable.

### Accessing an element

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616893930984/EvSmchQ5q.png)
Although you can use **[ ]** operator, it is safer to use the **get()** function. If the key is not present in the dictionary, it returns a None instead of raising a Key Error. Additionally, you can also pass the default value. In the last print statement, a default empty string is returned if the key is not found.

### Inserting a key-value pair where the value is a list or dictionary


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616896649094/S5mAB1-Uf.png)

In line 2, since **key2** doesn't exist the second line would give an error. To avoid the error, we can use the **setdefault()** function. If the key doesn't exist, it creates a key-value pair with the default value specified. This can also be used when we have a dictionary as a value.

### Merging Dictionaries
The update method merges two dictionaries. 

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616897870005/aBsDnmuXr.png)

In the above case, the key-value pairs of **dict2** are added to **dict1**. If there are any common keys present, the value is updated. In the above case, **key1** is in both dictionaries. As a result of the update, the value of **key1** is changed to **Value 3**
Below is the output of the print statement
```
{'key1': 'Value 3', 'key2': 'Value 2'}
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616898210059/y9HphBwDg.png)
 
In the above case, the value of **key1** in **dict2** changes to **Value 1**. Below is the output of the statement
```
{'key1': 'Value 1', 'key2': 'Value 2'}
```

### Copying Dictionaries


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616898895008/Kje7DYNUL.png)

Copying using the assignment operator creates a shallow copy, i.e it actually creates and assigns a reference to the dictionary. Any changes made in **dict2** are also reflected in **dict1**. We can use the **id()** function to check the memory address of the dictionaries, both of them have the same address. As a result, any changes made in **dict1** or **dict2** are reflected in both dictionaries.


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1616899096441/RV0sw8-d1.png)

In the above case, we are creating a deep copy, i.e the values are copied. Therefore any changes in **dict2** are not shown in **dict1**. It is always safer to do a deepcopy to avoid unintentional updates to the original dictionary

### Summary
- A dictionary has a lookup time of O(1)
- It is safer to use the get()  method when accessing elements in a dictionary
- Use setdefault() when you want to store a create a dictionary of lists or a dictionary of dictionaries
- Use deepcopy to copy dictionary to avoid unintentional updates to the original dictionary