python3:dict的子类_defaultdict

我们是可以继承dict 的,代码如下

class My_dict(dict):
    def __setitem__(self, key, value):
        super().__setitem__(key,value*value)

a=My_dict(one=2)

print(a["one"])

打印结果:
2

My_dict 子类继承了dict ,并调用了父类的setitem,并针对value做了一个乘积,

从结果我们发现并没有乘积。为了找原因也得爬源码查找dict 的setitem方法如下

        def __setitem__(self, *args, **kwargs): # real signature unknown
        """ Set self[key] to value. """
        pass

这个方法没有做任何处理,并不适用继承dict,难道就没有办法吗,
python 给你关闭一扇窗,会给你再开一个门,这个门就是
继承Userdict 可以实现乘积,请看代码

from collections import  UserDict
class My_dict(UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key,value*value)

a=My_dict(one=2)

print(a["one"])

打印结果:

4

刨析源码查看 这个方法

def __setitem__(self, key, item): self.data[key] = item

道理很明白了吧 ,我也不用解释了。

下边介绍重量级的人物就是 defautdict
因为他可以重写一个魔法函数 missing ,我们按照顺序介绍下

查看 UserDict的getitem 方法如下:

    def __getitem__(self, key):
        if key in self.data:
            return self.data[key]
        if hasattr(self.__class__, "__missing__"):
            return self.__class__.__missing__(self, key)
       raise KeyError(key)

有两个if 语句
1.如果key存在返回value
2.如果不存在就return missing魔法函数 。

我们查看 defautdict 里面的missing 魔法函数

    def __missing__(self, key): # real signature unknown; restored from __doc__
        """
        __missing__(key) # Called by __getitem__ for missing key; pseudo-code:
          if self.default_factory is None: raise KeyError((key,))
          self[key] = value = self.default_factory()
          return value
        """
        pass

从上边的描述有个关键信息 self[key] = value = self.default_factory()

如果不存在我会给个默认值

default_factory() 这个方法有property属性,可以自己查下,我在以后的章节再介绍。

代码例子如下:

from collections import  UserDict,defaultdict

my_dict={"person":1}
my_dict=defaultdict(int)
value=my_dict["animal"]
print(value)
打印结果:
0

如果没有 defaultdict 一定会报keyerror,自己可以试试。
由于defaultdict 有missing 方法,避免了报keyerror。

下边讲讲基本的用处
1.类型名称作为初始化函数参数

from collections import  UserDict,defaultdict

fruit=["apple","banana","orange"]

v=defaultdict(int)

for i in fruit:
    v[i]+=1
print(v)

打印结果:

defaultdict(<class 'int'>, {'apple': 1, 'banana': 1, 'orange': 1})

如果defaultdict(int) 初始化数值默认是0,如果是str是空, 如果是list是[],如果是dict是{}
自己可以尝试下

2.可以调用函数作为初始化函数参数

from collections import  UserDict,defaultdict

def add():
    return 8+9

v=defaultdict(add)

value=v["boody"]
print(value)

打印的结果是:

17

defautdict 作为dict 子类用处很大,上边的例子调用了方法作为默认值,这个在实际应用的用的最多,请大家记牢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码中的entity_dict_in_file是一个defaultdict对象,用于存储实体的信息。defaultdictPython中的一个字典类,它的特点是在查询一个不存在的键时不会报错,而是会返回一个默认值。在这里,entity_dict_in_file使用了两层嵌套的defaultdict,第一层的键是字符串类型,第二层的键也是字符串类型,值是一个列表。 lambda: defaultdict(list) 是一个匿名函数,它返回一个defaultdict(list)对象作为默认值。这意味着当我们查询一个不存在的键时,会返回一个空的列表作为默认值。所以entity_dict_in_file的结构可以理解为,第一层的键是字符串类型的实体名,第二层的键是字符串类型的文件名,值是一个列表,用来存储该实体在该文件中的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [GPT3:语言模型在命名实体识别中的应用(GPT3:Applicationof GPT 3 in Named Entity Recognition](https://blog.csdn.net/universsky2015/article/details/131929008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [biaffine model:Named Entity Recognition as Dependency Parsing](https://blog.csdn.net/mynameisgt/article/details/128018214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值