如何修改Python的'default'字典以始终返回默认值
我在用这些东西来打印数据包中分配的IANA值的名称。所以所有的字典都有一个默认值“RESERVED”。
我不想用 d.get(key,default) 这种方式,而是想通过 d[key] 来访问字典,这样如果这个键不在字典里,就能返回一个默认值(这个默认值在所有字典中都是一样的)。
我不一定非得用字典,但它们是最直观的选择……还有一个我可以这样做的字典
d = {
1..16 = "RESERVED",
17 : "Foo",
18 : "Bar,
19..255: "INVALID"
}
会是我最想要的解决方案。
元组也是另一种选择,但那样的话我可能会在赋值时出错……(而且我的代码就不太容易让人看懂了)
哦对了,我用的是Python 2.4。
相关问题:
3 个回答
0
你可以使用下面这个类(在Python 2.7中测试过)。只需要把零改成你喜欢的任何默认值就可以了。
class cDefaultDict(dict):
# dictionary that returns zero for missing keys
# keys with zero values are not stored
def __missing__(self,key):
return 0
def __setitem__(self, key, value):
if value==0:
if key in self: # returns zero anyway, so no need to store it
del self[key]
else:
dict.__setitem__(self, key, value)
9
如果你能升级到Python 2.5版本,那么就可以使用一个叫做defaultdict的类,具体内容可以在这里找到。这个类可以让你传入一个初始化函数,这样你就能得到你想要的结果。如果不能升级的话,你可能需要自己写一个类似的功能了。
4
如果可以的话,建议你使用Mario的解决方案。
如果不行,那你就需要创建一个类似字典的对象。你可以直接从“dict”继承,这样会很快也很高效。如果你用的是旧版Python,不能直接从“dict”继承,那就可以用“UserDict”,这是一个纯Python实现的字典。
用它的话,你可以这样做:
#!/usr/bin/env python
# -*- coding= UTF-8 -*-
import UserDict
class DefaultDict(UserDict.UserDict) :
default_value = 'RESERVED'
def __getitem__(self, key) :
return self.data.get(key, DefaultDict.default_value)
d = DefaultDict()
d["yes"] = True;
print d["yes"]
print d["no"]
需要注意的是,“UserDict”比“dict”要慢一些。