如何修改Python'默认'字典,使其始终返回默认值

时间:2009-10-22 08:27:23

标签: python dictionary python-2.4

我正在使用它们来打印数据包中指定的IANA值的名称。因此,所有字典都具有相同的默认值“RESERVED”。

我不想使用d.get(key,default),而是通过d[key]访问词典,这样如果键不在d中,它将返回默认值(对所有词典都相同)。

我不一定需要使用字典,但它们是直观的选择...... 还有,我可以做的一本字典

d = {
   1..16 = "RESERVED",
   17 : "Foo",
   18 : "Bar,
   19..255: "INVALID"
  }

将是首选解决方案

元组可能是另一种选择,但是我很容易抵消分配值的错误......(而且我的代码不会是“人类可读的”)

哦,是的,Python 2.4

3 个答案:

答案 0 :(得分:9)

如果您可以迁移到Python 2.5,则会显示 defaultdict 类,如here所示。您可以传递一个初始化程序,返回您想要的内容。否则,我担心你必须推出自己的实现。

答案 1 :(得分:4)

如果可以,请使用Mario's solution

如果你不能,你只需要子类化类似字典的对象。现在,您可以通过直接从“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”慢。

答案 2 :(得分: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)