擅长:python、mysql、java
<p>可以说,<code>defaultdict</code>在填充dict</em>之前对设置默认值<em>很有用,<code>setdefault</code>在填充dict</em>时或之后对设置默认值<em>很有用。</p>
<p>可能是最常见的用例:分组项(在未排序的数据中,否则使用<code>itertools.groupby</code>)</p>
<pre><code># really verbose
new = {}
for (key, value) in data:
if key in new:
new[key].append( value )
else:
new[key] = [value]
# easy with setdefault
new = {}
for (key, value) in data:
group = new.setdefault(key, []) # key might exist already
group.append( value )
# even simpler with defaultdict
new = defaultdict(list)
for (key, value) in data:
new[key].append( value ) # all keys have a default already
</code></pre>
<p>有时您希望确保在创建dict之后存在特定的键。<code>defaultdict</code>在这种情况下不起作用,因为它只在显式访问时创建键。假设您使用了带有许多头的HTTP-ish——有些是可选的,但您希望它们具有默认值:</p>
<pre><code>headers = parse_headers( msg ) # parse the message, get a dict
# now add all the optional headers
for headername, defaultvalue in optional_headers:
headers.setdefault( headername, defaultvalue )
</code></pre>