如何重写Python字典以获取默认值

3 投票
5 回答
3178 浏览
提问于 2025-04-16 09:24

我想要重新编写Python中访问字典的方式,也就是getitem,让它能够返回默认值。

我想要的功能大概是这样的:

a = dict()
a.setdefault_value(None)
print a[100] #this would return none

有没有什么建议呢?

谢谢!

5 个回答

1

如果你真的不想使用内置的 defaultdict,你需要自己定义一个字典的子类,像这样:

class MyDefaultDict(dict):
    def setdefault_value(self, default):
        self.__default = default
    def __getitem__(self, key):
        try:
            return self[key]
        except IndexError:
            return self.__default
3

从Python 2.6开始,有一个叫做defaultdict的内置功能。它的构造函数可以接收一个函数,当找不到某个值时,这个函数会被调用。这样比起直接返回None,更灵活。

from collections import defaultdict

a = defaultdict(lambda: None)
print a[100] #gives None

lambda是用来快速定义一个没有名字的一行函数的方式。这段代码其实是等价的:

def nonegetter():
    return None

a = defaultdict(nonegetter)
print a[100] #gives None

这个模式非常有用,它可以给你一个哈希表,显示每个独特对象的计数。如果使用普通的字典,你就需要处理一些特殊情况,以避免出现KeyError错误。

counts = defaultdict(int)
for obj in mylist:
   counts[obj] += 1
11

其实,Python里已经有一个叫做 collections.defaultdict 的东西了:

from collections import defaultdict

a = defaultdict(lambda:None)
print a[100]

撰写回答