Python拓展dict类
文章目录
- 问题描述
- 解决方案
- 自动逐层创建字典
- 实例创建及类型转换
- 潜在问题
问题描述
在使用python字典的时候经常会遇到一个问题,就是多层字典需要逐层创建。比如:
a = {'a': 'a'}
a['b']['c'] = 1 # 这里会报错,dict不会自动创建多层结构
所以这里就给出一个dict类的拓展方法
解决方案
先给出最终方案,方便日后直接抄作业,后面会给出详解。
class compositedict(dict):def __init__(self, seq=None, **kwargs):super(compositedict, self).__init__()if seq is None:passelif isinstance(seq, dict):for k, v in seq.items():self[k] = compositedict(v) if isinstance(v, dict) else velse:for k, v in seq:self[k] = compositedict(v) if isinstance(v, dict) else vfor k, v in kwargs.items():self[k] = compositedict(v) if isinstance(v, dict) else vdef __getitem__(self, item):if not self.__contains__(item):self[item] = compositedict()return super(compositedict, self).__getitem__(item)
自动逐层创建字典
用[]
获取键值的时候判断是否存在,不存在则创建新compositedict
,保证能递归到更深层
class compositedict(dict):def __getitem__(self, item):if not self.__contains__(item):self[item] = compositedict()return super(compositedict, self).__getitem__(item)
验证:
a = compositedict()
a['a']['b']['c'] = 'd'
print(a)
print(type(a['b']))
输出:
实例创建及类型转换
上面只是实现了在深层索引的时候自动创建字典,但是初始化创建及类型转换的时候仍然会存在问题,比如:
a = {'xxx': {'yyy': {'zzz': 'a'}}}
b = compositedict(a)
b['xxx']['vvv']['www'] = 'b'
上面的代码会报错KeyError,因为b['xxx']
类型仍然是dict,因此我们要做的是将变量每一层的dict
都替换为compositedict
。
要解决问题,我们先看一下dict的__init__
方法:
def __init__(self, seq=None, **kwargs): # known special case of dict.__init__"""dict() -> new empty dictionarydict(mapping) -> new dictionary initialized from a mapping object's(key, value) pairsdict(iterable) -> new dictionary initialized as if via:d = {}for k, v in iterable:d[k] = vdict(**kwargs) -> new dictionary initialized with the name=value pairsin the keyword argument list. For example: dict(one=1, two=2)# (copied from class doc)"""pass
总结来看,层级结构中出现dict会有以下几种情况:
dict({'a': {'b': 'c'}})
dict([('a', {'b': 'b'}), ('c', 'd')])
dict(a={'b': 'b'})
针对以上情况,基于已有的compositedict
重载__init__
方法:
class compositedict(dict):def __init__(self, seq=None, **kwargs):super(compositedict, self).__init__()if seq is None: # 需要特殊处理None情况passelif isinstance(seq, dict): # 处理seq为dict的情况for k, v in seq.items():self[k] = compositedict(v) if isinstance(v, dict) else velse:for k, v in seq: # 处理seq为列表结构的情况self[k] = compositedict(v) if isinstance(v, dict) else vfor k, v in kwargs.items(): # 对kwargs中的键值对同样递归处理self[k] = compositedict(v) if isinstance(v, dict) else vdef __getitem__(self, item):if not self.__contains__(item):self[item] = compositedict()return super(compositedict, self).__getitem__(item)
验证:
a = compositedict({'a': {'b': {'c': 'c'}}})
print(type(a['a']))
print(type(a['a']['b']))
print(type(a['a']['d']))
print(a)
b = compositedict([('a', {'b': 'b'})])
print(type(b['a']))
c = compositedict(a={'a': 'b'})
print(type(c['a']))
输出:
潜在问题
这个解决方案有个潜在问题:可能会创建非期望的空字典
举个例子:
a = compositedict()
b = 0 if a['a'].get('b') else 1
print(a)
输出:{'a': {}}
由此我们可以看到,a在判断语句中值被改变了,在某些情况下这是我们不期望的结果,所以使用的时候需注意。
Python拓展dict类相关推荐
- Python -- dict 类
Python dict类常用方法: class dict(object): def clear(self): #清除字典中所有元素形成空字典,del是删除整个字典: >>> tes ...
- python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)
python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...
- 用 Python 拓展 GDB(三)
欢迎来到<用python拓展gdb>的第三篇.上一篇我们谈到了pretty printer,一个需要python支持的特性.这一篇我们谈论另一个需要python支持的特性,convenie ...
- python中扑克牌类设计_Python中的计数 Counter类
点击上方"AI机器学习与深度学习算法",选择"星标"公众号 原创干货,第一时间送达 在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个 ...
- 风变Python编程13类的学习2
Python 类的学习2 上一关,我们知道了面向对象编程的重要性,也学习了类的基础知识(1.面向对象编程,2.类的创建和调用,3.创建类的两个关键点) 这一关,我们会拓展类的知识疆界,探索两个类的拓展 ...
- Python中的类、实例以及方法,MRO继承解析顺序以及Mixin类
Contents 1. 什么是类和实例 2. 类的实例方法.类方法和静态方法 3. MRO是什么,描述其查找顺序 4. Mixin是什么,描述其应用场景 5. References 1. 什么是类和实 ...
- python编程基础—类与对象
1.类的声明与定义 Python 是一门面向对象的语言. 面向对象编程 - Object Oriented Programming(简称 OOP)是一种编程思想,在面向对象编程中,把对象作为程序的基本 ...
- python之dict
什么是dict List 和 tuple 可以用来表示顺序集合 例:班里同学的名字和考试的成绩 ['Alice', 'Bob', 'Candy', 'David', 'Ellena'] # List ...
- python如何定义类_python中定义类
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 类的定义python中,定义类是通过class关键字,例如我们定义一个存储学生信 ...
- python 中的类的类方法参数self
本文转载自:python--类中的self到底有什么作用 python创建的类的函数参数中的self有什么用呢?下面创建一个关于狗的类来说一下: class Dog:# 表示狗的类def __init ...
最新文章
- 四次面试:程序员越来越悲催了
- oracle数据连接java,java是与Oracle数据连接(jdbc)
- 阮一峰react demo代码研究的学习笔记 - React demo1 debug - how is jsx converted to js
- [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
- jquery源码解析:proxy,access,swap,isArraylike详解
- Servlet超详解+流程图
- Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
- 禁止跨域_新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境
- 资深解毒:盖码饭和盖浇饭的区别是什么?
- 怎样在计算机硬盘里新建文件,高手教你轻松新建文件夹
- Libmodbus 移植
- python天涯帖子_Python爬虫实战(二):爬取天涯帖子(只看楼主)
- 走进社交网络 二期功能完成
- cups支持的打印机列表_CUPS共享打印机服务
- 大庆金桥:基于 SpreadJS 开发实现计量器具检定证书的在线生成与打印
- 健身菜鸟需要掌握哪些基本的健身常识
- 奇迹mu修改服务器名,奇迹MU 红名设置调整方案说明
- Photoshop Elements 2023 for mac/win(PS简化版2023)​
- T1.特殊的毕达哥拉斯三元数(11.19)
- 手机充电线接头处容易断裂怎么办?
热门文章
- sqlserver2008已成功与服务器建立连接 但在登录过程中发生错误,指定的网络名不可再用(已解决)
- Python从入门到数据分析第一篇—Python简介- Python介绍与初探
- Word文档打印技巧:如何将文档排版成双面对折打印
- 我们整理了20个Python项目,送给正在求职的你
- 《机器学习实战》 自制勘误表 中文版第一版2015年9月第11次印刷版
- 挖个大坑:挑战用纯micropython写一个nes模拟器(一)
- 【MySQL-关键字】MySQL中的desc什么意思?有哪些作用?
- 《开学第一课》观后感——幸福
- oracle创建用户并授权管理员,Oracle创建用户并授权【数据库】
- 视频流服务器-red5的安装与使用