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, ???)
似乎不帮助。我可能应该继承 dict
或 defaultdict
并重载 __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()
.
更具可读性
我是运行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, ???)
似乎不帮助。我可能应该继承 dict
或 defaultdict
并重载 __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()
.