3

我正在使用它们来打印数据包中分配的 IANA 值的名称。所以所有的字典都有相同的默认值“RESERVED”。

我不想使用d.get(key,default)但访问字典,d[key]这样如果键不在 d 中,它会返回默认值(所有字典都相同)。

我不一定需要使用字典,但它们是直观的选择......另外,我可以这样做的字典

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

将是首选解决方案

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

哦,是的,Python 2.4

4

3 回答 3

9

如果可以迁移到 Python 2.5,则有defaultdict类,如此所示。您可以向它传递一个返回您想要的内容的初始化程序。否则,我担心你将不得不推出自己的实现。

于 2009-10-22T08:37:59.057 回答
4

如果可以,请使用马里奥的解决方案

如果你不能,你只需要子类化一个类似字典的对象。现在,您可以通过直接从“dict”继承来做到这一点,它将快速高效。对于无法从“dict”继承的旧 Python 版本,有“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”慢。

于 2009-10-22T09:00:38.123 回答
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)
于 2014-04-30T13:03:33.500 回答