USECASE
The aim of this pageđź“ť is to explain the concept and usage of Python's defaultdict
from the collections
module, specifically wondering about the weird name. It is inspired by David Baezley's Advanced Python Mastery, see ex_2_2 > Collections.
defaultdict
:
- provides a default value for missing keys
- avoids
KeyError
by initializing keys automatically - is named for its default behavior of initializing elements
- simplifies code by avoiding manual checks and insertions
- only a callable object (type or function) is passed to initialize
- in the given example,
list
is used as the default factory - which means that it automatically creates an empty list for missing keys
- and facilitates grouping data efficiently
- can also use lambda functions for other, literal default values
- example:
defaultdict(lambda: 0)
returns0
for missing keys
Example Code From Advanced Python Mastery
portfolio
[{'name': 'AA', 'shares': 100, 'price': 32.2}, {'name': 'IBM', 'shares': 50, 'price': 91.1}, {'name': 'CAT', 'shares': 150, 'price': 83.44}, {'name': 'MSFT', 'shares': 200, 'price': 51.23}, {'name': 'GE', 'shares': 95, 'price': 40.37}, {'name': 'MSFT', 'shares': 50, 'price': 65.1}, {'name': 'IBM', 'shares': 100, 'price': 70.44}]
print("### DEFAULTDICT")
from collections import defaultdict
print("#### Group data, e.g. find all stocks with the same name")
byname = defaultdict(list)
for s in portfolio:
byname[s["name"]].append(s)
byname
# defaultdict(<class 'list'>, {'AA': [{'name': 'AA', 'shares': 100, 'price': 32.2}], 'IBM': [{'name': 'IBM', 'shares': 50, 'price': 91.1}, {'name': 'IBM', 'shares': 100, 'price': 70.44}], 'CAT': [{'name': 'CAT', 'shares': 150, 'price': 83.44}], 'MSFT': [{'name': 'MSFT', 'shares': 200, 'price': 51.23}, {'name': 'MSFT', 'shares': 50, 'price': 65.1}], 'GE': [{'name': 'GE', 'shares': 95, 'price': 40.37}]})
print('#### Find all stocks with the name "IBM"')
byname["IBM"]
# >>> [{'name': 'IBM', 'shares': 50, 'price': 91.1}, {'name': 'IBM', 'shares': 100, 'price': 70.44}]
Example with Lambda:
from collections import defaultdict
byname = defaultdict(lambda: 0)
print(byname["missing_key"]) # This will return 0
Top comments (0)