Python 字典类型拓展(包括 MappingProxyType 只读字典, defaultdict 缺省字典和 ChainMap)

Python 除了 dict 字典类型, 还有相关的字典扩展类型, 包括MappingProxyType 只读字典, defaultdict 缺省字典和 ChainMap


MappingProxyType 只读字典

MappingProxyType 为普通字典提供只读视图

除了无法修改, 只读字典与普通字典的功能一致


  • 只读字典运算:
>>> from types import MappingProxyType
>>> w = {'ide': 'PyCharm'}
>>> r = MappingProxyType(w)
>>> len(r)
1
>>> r['ide']
'PyCharm'
# 无法修改
>>> r['language'] = 'Python'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment
# 成员运算
>>> 'ide' in r
True
# 比较运算, 与原字典相等
>>> r == w
True
# 并集(Python 3.9 新增), 因本身不可修改, 返回了新的字典
>>> r | {'language': 'Python'}
{'ide': 'PyCharm', 'language': 'Python'}

更新原字典后, 只读字典会同步修改

>>> w['version'] = '3.9'
>>> r
mappingproxy({'ide': 'PyCharm', 'version': '3.9'})
  • 只读字典方法:
>>> r.get('language', 'Go')
'Go'
# 只读字典也支持 keys(), values(), items() 方法
>>> for k, v in r.items():
...     print(f"{k}:{v}")
... 
ide:PyCharm
version:3.9

defaultdict 缺省字典

当字典的键不存在时, defaultdict 使用工厂函数的返回值作为这个键对应的值


常用的工厂函数有 int, list 等, 不传参数时返回一个工厂默认值

>>> int()
0
>>> list()
[]

使用缺省字典

>>> from collections import defaultdict
>>> dd = defaultdict(list)
# 键不存在时, 调用工厂函数(没有参数的调用), 将返回值(空列表)作为字典的值
>>> dd['other']
[]
>>> dd['ide'].append('VSCode')
>>> dd
defaultdict(<class 'list'>, {'other': [], 'ide': ['VSCode']})

在底层 defaultdict 比普通字典 dict 多实现了 __missing__ 方法, 在字典的键不存在时, 该方法会被调用


ChainMap

ChainMap 将多个字典组成一个映射数据结构, 在使用上与字典一致

  1. 通过键访问值时, 优先返回第一个包含该键的字典的值
  2. 修改 ChainMap 时, 仅更新第一个字典

>>> from collections import ChainMap
>>> d_1 = {'one': 1, 'two': 2}
>>> d_2 = {'two': 0, 'six': 6}
>>> d = ChainMap(d_1, d_2)
# 访问 ChainMap
>>> d['two']
2
# 修改 ChainMap
>>> d['ten'] = 10
# 实际修改了第一个字典
>>> d_1
{'one': 1, 'two': 2, 'ten': 10}

# 与普通字典一样的使用
>>> list(d.keys())
['two', 'six', 'one', 'ten']
>>> list(d.values())
[2, 6, 1, 10]
>>> d.get('other', 0)
0

在底层 ChainMap 的 maps 属性保存了所有的字典

>>> d.maps
[{'one': 1, 'two': 2, 'ten': 10}, {'two': 0, 'six': 6}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythondefaultdict是一种字典的子类,它在创建时会指定一个默认值的类型,当我们访问字典中不存在的键时,它不会引发KeyError报错,而是返回该默认值。这对于处理字典中不存在的键非常方便。 下面是一个使用defaultdict的案例: ```python from collections import defaultdict # 创建一个defaultdict,默认值为int类型(默认值为0) d = defaultdict(int) # 访问不存在的键 print(d['a']) # 输出 0 # 添加元素 d['b'] = 10 d['c'] += 1 # 输出字典 print(d) # 输出 defaultdict(<class 'int'>, {'a': 0, 'b': 10, 'c': 1}) ``` 在上面的例子中,我们创建了一个默认值为int类型(默认值为0)的defaultdict。当访问字典中不存在的键'a'时,它会返回默认值0,而不会引发KeyError报错。我们还可以像普通字典一样添加和修改元素。 另外,defaultdict还可以与其他数据类型一起使用,比如list、set等,以满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python - 内置类型dict字典](https://blog.csdn.net/helunqu2017/article/details/116348007)[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: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值