Python 带默认键的字典

Python dictionary with default key

我是运行Python2.7.10.

我想要一本字典 return 将值存储在特定键中以防丢失项目。例如,像这样的东西:

myD = dict(...)
return myD[key] if key in myD else myD[defaultKey]

只是为了确保清楚,我想调用 myD[key] 并获得正确的值 returned,而我的代码中没有额外的 if...else...

这不完全是 defaultdict 所做的(因为它需要一个函数作为默认调用)并且不完全是 dict.setdefault() 所做的,并且 myD.get(key, ???) 似乎不帮助。我可能应该继承 dictdefaultdict 并重载 __init__()missing() 方法,但我想不出一个好的方法来做到这一点。

在您的情况下,dict.get 应该有效(我知道您已经提到它无效)。你试过了吗:

myD.get(key,myD[defaultKey])

我不完全确定你想要什么(没有阅读所有你问题下的评论),但我认为这可能至少接近你想要的。

class DefaultKeyDict(dict):
    def __init__(self, default_key, *args, **kwargs):
        self.default_key = default_key
        super(DefaultKeyDict, self).__init__(*args, **kwargs)

    def __missing__ (self, key):
        if self.default_key not in self:  # default key not defined
            raise KeyError(key)
        return self[self.default_key]

    def __repr__(self):
        return ('{}({!r}, {})'.format(self.__class__.__name__,
                                      self.default_key,
                                      super(DefaultKeyDict, self).__repr__()))

    def __reduce__(self):  # optional, for pickle support
        args = (self.default_key if self.default_key in self else None,)
        return self.__class__, args, None, None, self.iteritems()

dkdict = DefaultKeyDict('b', {'a': 1, 'b': 2, 'c': 3})

print dkdict['a']  # -> 1
print dkdict['b']  # -> 2
print dkdict['c']  # -> 3
print dkdict['d']  # -> 2 (value of the default key)

del dkdict['b']  # delete the default key
try:
    print dkdict['d']  # should now raise exception like normal
except KeyError:
    print("dkdict['d'] raised a KeyError")

您可能需要修改 class __init__() 方法以接受默认键及其值作为参数(而不仅仅是键)。

覆盖__getitem__时,可以简单地使用方括号。它 returns 第一个有效键的值和 None 如果没有找到键。

class mDict(dict):
    def __getitem__(self, keys):
        for k in keys:
            if k in self:
                return self.get(k)

mdict = mDict({'a': 1, 'b': 2, 'default': 3})

mdict['a', 'default']        # -> 1
mdict['X', 'b', 'default']   # -> 2
mdict['X', 'Y', 'default']   # -> 3
mdict['X', 'Y', 'Z']         # -> None

在这里也可以使用不止两个键,这比许多嵌套 .get().

更具可读性