Explaining defaultdict in Python

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) returns 0 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

原文链接:Explaining defaultdict in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
The course of true love never did run smooth.
真诚的爱情之路永不会是平坦的
评论 抢沙发

请登录后发表评论

    暂无评论内容