Handling Missing Keys With defaultdict (Summary)
The Python defaultdict
type is a dictionary-like data structure provided by the Python standard library in a module called collections
. The class inherits from dict
, and its main added functionality is to supply default values for missing keys. In this course, you’ve learned how to use the Python defaultdict
type for handling the missing keys in a dictionary.
You’re now able to:
- Create and use a Python
defaultdict
to handle missing keys - Solve real-world problems related to grouping, counting, and accumulating operations
- Know the implementation differences between
defaultdict
anddict
- Decide when and why to use a Python
defaultdict
rather than a standarddict
Congratulations, you made it to the end of the course! What’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment in the discussion section and let us know.
00:00 Welcome to the seventh and final lesson. This is the concluding lesson and it’s basically a recap of the things which I’ve been showing you in this course.
00:10
We started off in the beginning by introducing defaultdict
and I mentioned that it’s a subclass of dict
. So it’s really a kind of dictionary which handles missing keys differently from the way dictionaries normally do.
00:22
And it does this by generating a default value whenever you try to access a key which isn’t present in your defaultdict
, whereas what would normally happen with a dictionary is you would get an error. You would get a traceback and a KeyError
.
00:37
In the second lesson, before really diving into defaultdict
and as a way to set the stage more generally, I mentioned the tools which you can use in dict
to handle missing keys out of the box. And you really have two of them.
00:49
One is .get()
, which returns a value which isn’t mapped to anything, and it doesn’t update the dictionary. What I mean by that is that after the line which ran .get()
on your dictionary, your dictionary still doesn’t have an entry for the missing key. Another method which is available to you is .setdefault()
. .setdefault()
also avoids a traceback but unlike .get()
, it also modifies the dictionary.
01:15 So in both of these methods, you’re providing the key which you’re looking for and you’re providing a default value. If the key which you’re looking for is present in the dictionary, then the value mapped to that key will be returned.
01:27
But if the key isn’t in the dictionary, then both of these methods will return a default value, which you’re providing as a second argument. The difference between them is that in the case of .get()
, the dictionary is left alone, so after running .get()
the dictionary still doesn’t have a value mapped to this key, whereas .setdefault()
updates the dictionary. It actually inserts the key with a default value which you provided. In the lesson after that, we really started going into defaultdict
.
01:57
We saw that two very important aspects of defaultdict
is that, first, it overrides .__missing__()
as it commonly exists in dict
structures.
02:06
And the way it overrides it is by triggering .default_factory()
, and .default_factory()
is what is going to generate a default value for your missing key.
02:16
After having started to explore how defaultdict
works, we looked at different use cases and how you can use it to solve some very concrete problems. You can use it to group items, to group unique items, to count items, or to accumulate values.
02:30
And the way you adapt defaultdict
to these different scenarios is by adjusting which callable you’re going to pass it as an argument. So depending on your use case, you would pass a list
, a set
, an int
, or a float
.
02:44
Next, we dived a bit deeper into how defaultdict
works under the hood. First of all, we contrasted it with dict
. dict
is the parent class, so we highlighted which things are different about defaultdict
.
02:55
We looked a bit more closely at .default_factory
—which is an attribute of defaultdict
—and how you can update it. We contrasted the behavior and some performance issues with .setdefault()
, so with one of the standard dict
methods for handling missing keys.
03:11
And then finally, I told you a bit more about the role which .__missing__()
is playing in the way defaultdict
works. Then in the lesson just before this one, I told you about ways in which you can pass arguments to defaultdict
.
03:24
So, defaultdict
doesn’t really take arguments by design. It’s intended to take a callable as an argument, and that callable doesn’t in turn take any arguments. However, you can use lambda
and functools.partial()
as ways to get around that limitation and pass arguments to defaultdict
when you’re using it. Okay, so that’s it for this course. We covered a lot of ground.
03:48 I hope you enjoyed it as much as I did, and I hope you’ll practice what you’ve learned. Bye-bye!
fowydn on June 2, 2023
Very clear tutorial, thank you a lot.
Become a Member to join the conversation.
Ghani on Nov. 22, 2020
Very good course; thanks!