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
<span>portfolio</span><span>[{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>AA</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>100</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>32.2</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>IBM</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>50</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>91.1</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>CAT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>150</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>83.44</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>MSFT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>200</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>51.23</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>GE</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>95</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>40.37</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>MSFT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>50</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>65.1</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>IBM</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>100</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>70.44</span><span>}]</span><span>print</span><span>(</span><span>"</span><span>### DEFAULTDICT</span><span>"</span><span>)</span><span>from</span> <span>collections</span> <span>import</span> <span>defaultdict</span><span>print</span><span>(</span><span>"</span><span>#### Group data, e.g. find all stocks with the same name</span><span>"</span><span>)</span><span>byname</span> <span>=</span> <span>defaultdict</span><span>(</span><span>list</span><span>)</span><span>for</span> <span>s</span> <span>in</span> <span>portfolio</span><span>:</span><span>byname</span><span>[</span><span>s</span><span>[</span><span>"</span><span>name</span><span>"</span><span>]].</span><span>append</span><span>(</span><span>s</span><span>)</span><span>byname</span><span># 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}]}) </span><span>print</span><span>(</span><span>'</span><span>#### Find all stocks with the name </span><span>"</span><span>IBM</span><span>"'</span><span>)</span><span>byname</span><span>[</span><span>"</span><span>IBM</span><span>"</span><span>]</span><span># >>> [{'name': 'IBM', 'shares': 50, 'price': 91.1}, {'name': 'IBM', 'shares': 100, 'price': 70.44}] </span><span>portfolio</span> <span>[{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>AA</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>100</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>32.2</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>IBM</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>50</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>91.1</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>CAT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>150</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>83.44</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>MSFT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>200</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>51.23</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>GE</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>95</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>40.37</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>MSFT</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>50</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>65.1</span><span>},</span> <span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>IBM</span><span>'</span><span>,</span> <span>'</span><span>shares</span><span>'</span><span>:</span> <span>100</span><span>,</span> <span>'</span><span>price</span><span>'</span><span>:</span> <span>70.44</span><span>}]</span> <span>print</span><span>(</span><span>"</span><span>### DEFAULTDICT</span><span>"</span><span>)</span> <span>from</span> <span>collections</span> <span>import</span> <span>defaultdict</span> <span>print</span><span>(</span><span>"</span><span>#### Group data, e.g. find all stocks with the same name</span><span>"</span><span>)</span> <span>byname</span> <span>=</span> <span>defaultdict</span><span>(</span><span>list</span><span>)</span> <span>for</span> <span>s</span> <span>in</span> <span>portfolio</span><span>:</span> <span>byname</span><span>[</span><span>s</span><span>[</span><span>"</span><span>name</span><span>"</span><span>]].</span><span>append</span><span>(</span><span>s</span><span>)</span> <span>byname</span> <span># 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}]}) </span> <span>print</span><span>(</span><span>'</span><span>#### Find all stocks with the name </span><span>"</span><span>IBM</span><span>"'</span><span>)</span> <span>byname</span><span>[</span><span>"</span><span>IBM</span><span>"</span><span>]</span> <span># >>> [{'name': 'IBM', 'shares': 50, 'price': 91.1}, {'name': 'IBM', 'shares': 100, 'price': 70.44}] </span>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}]
Enter fullscreen mode Exit fullscreen mode
Example with Lambda:
<span>from</span> <span>collections</span> <span>import</span> <span>defaultdict</span><span>byname</span> <span>=</span> <span>defaultdict</span><span>(</span><span>lambda</span><span>:</span> <span>0</span><span>)</span><span>print</span><span>(</span><span>byname</span><span>[</span><span>"</span><span>missing_key</span><span>"</span><span>])</span> <span># This will return 0 </span><span>from</span> <span>collections</span> <span>import</span> <span>defaultdict</span> <span>byname</span> <span>=</span> <span>defaultdict</span><span>(</span><span>lambda</span><span>:</span> <span>0</span><span>)</span> <span>print</span><span>(</span><span>byname</span><span>[</span><span>"</span><span>missing_key</span><span>"</span><span>])</span> <span># This will return 0 </span>from collections import defaultdict byname = defaultdict(lambda: 0) print(byname["missing_key"]) # This will return 0
Enter fullscreen mode Exit fullscreen mode
© 版权声明
THE END
暂无评论内容