We begin in a library, where we want to count book copies. With a small collection, we might be able to tally each one manually. However, as the collection grows, this approach becomes cumbersome and inefficient. A more efficient method uses a HashMap, or a dictionary
in Python.
For a quick illustration, consider this list of colors:
Python1colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
If we count manually, red
appears twice, blue
appears thrice, and green
appears once. We can employ HashMaps for a more efficient counting process.
Simple yet powerful, HashMaps allow us to store and retrieve data using keys. The unique colors in our list act as keys, and the count of each color becomes its corresponding value. Let's demonstrate how we can count elements in our colors
list using a Python dictionary:
Python1colors = ['red', 'blue', 'red', 'green', 'blue', 'blue'] 2color_dict = {} 3 4# Start the loop to iterate over each color 5for color in colors: 6 7 # If the color is present in our dictionary, increment its value by 1 8 if color in color_dict: 9 color_dict[color] += 1 10 11 # If the color isn't present, it means we're encountering this color in our list for the first time. In this case, we add it to our dictionary and set its value to 1 12 else: 13 color_dict[color] = 1 14 15# At the end of the loop, print our dictionary with counts 16print(color_dict) 17# prints {'red': 2, 'blue': 3, 'green': 1}
When the above code executes, it displays the counts for each color: {'red': 2, 'blue': 3, 'green': 1}
.
Here's how we created a dictionary to count our elements:
We began with an empty dictionary. Then, we went through our list, and for every occurring element, we checked if it was in our dictionary. If it was, we increased its value. If it was not, we added it to the dictionary with a value of 1
.
Consequently, this code efficiently counts the colors in our list, showcasing how performant counting can be, even as the list size increases!
Python dictionaries have a get(key, default)
method, which is an alternative to checking whether a key already exists in a dictionary. It allows us to fetch the value of a key if it exists, or return a default value specified by you if it doesn't.
The code above can be also written like this:
Python1colors = ['red', 'blue', 'red', 'green', 'blue', 'blue'] 2color_dict = {} 3 4# Start the loop to iterate over each color 5for color in colors: 6 7 # Get the value of the color key if it exists, otherwise use a default value of 0. Then increment the value by 1 8 color_dict[color] = color_dict.get(color, 0) + 1 9 10# At the end of the loop, print our dictionary with counts 11print(color_dict) 12# prints {'red': 2, 'blue': 3, 'green': 1}
The time complexity of our approach is , where n is the number of elements in our list. This is because we iterate over our list exactly once, performing constant-time operations for each element. Here is why:
- Dictionary accesses (both setting a value and getting a value) in Python are typically , constant time operations.
- The
for
loop iterates over each element in the list exactly once, so it's operation.
The total time complexity, therefore, remains because the time taken is directly proportional to the number of items in the list. As the size of the list increases, the time taken scales linearly, making this approach efficient for larger collections.
It is also worth noting that the space complexity of this approach is , where k is the number of unique elements in the list. In the worst case scenario, where all elements are unique, the space complexity would be .
In conclusion, using hashmaps or dictionaries for counting is a time-efficient approach, especially when working with large datasets.
This approach can be applied to larger lists, strings, and nested collections to count elements. Counting is a ubiquitous task in areas like data analysis and natural language processing. You can employ this concept to count the frequency of words in sentences, characters in strings, or items in shopping lists.
Now, let's solidify the concept of counting occurrences using HashMaps with hands-on exercises. The core of this lesson has shown you how dictionaries can be used for efficient element counting. They are beneficial for enhancing code performance and organization!