编写dict和defaultdict的代码

时间:2013-11-22 14:07:13

标签: python defaultdict

我有以下问题:

from collections import defaultdict

def give_it_to_me(d):
    # This will crash if key 'it' does not exist
    return d['it']

def give_it2_to_me(d):
    # This will never crash, but does not trigger the default value in defaultdict
    return d.get('it2')

d1 = defaultdict(int)
d2 = { 'it' : 55 }

print give_it_to_me(d1)
print give_it_to_me(d2)

print give_it2_to_me(d1)
print give_it2_to_me(d2)

正如您在评论中所看到的,似乎无法编写give_it_to_me的版本:

  1. 永远不会崩溃
  2. 触发defaultdict s
  3. 的默认值

    或者我错了?

2 个答案:

答案 0 :(得分:3)

您的give_it_to_me功能可能需要更多代码。

使用try except语句检查现有密钥。

例如:

def give_it_to_me(d):
    # This won't crash if key 'it' does not exist in a normal dict.
    # It returns just None in that case.
    # It returns the default value of an defaultdict if the key is not found.
    try:
        return d['it']
    except KeyError:
        return None

答案 1 :(得分:1)

使用try .. except

try
    return d['it']
except KeyError:
    return None

为什么defaultdict.get无法正常工作

defaultdict是使用__missing__方法实现的。仅当__missing__键不在字典中时,dict[k](或dict.__getitem__(k))才会调用k方法。

defaultdict.__missing__ documentation也提到:

  

请注意,除了之外的任何操作都不会调用__missing__()   __getitem__()。这意味着get()将像普通词典一样,将None作为默认值而非使用default_factory返回。