文章目录

  • 问题描述
  • 解决方案
    • 自动逐层创建字典
    • 实例创建及类型转换
  • 潜在问题

问题描述

在使用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类相关推荐

  1. Python -- dict 类

    Python dict类常用方法: class dict(object): def clear(self):  #清除字典中所有元素形成空字典,del是删除整个字典: >>> tes ...

  2. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  3. 用 Python 拓展 GDB(三)

    欢迎来到<用python拓展gdb>的第三篇.上一篇我们谈到了pretty printer,一个需要python支持的特性.这一篇我们谈论另一个需要python支持的特性,convenie ...

  4. python中扑克牌类设计_Python中的计数 Counter类

    点击上方"AI机器学习与深度学习算法",选择"星标"公众号 原创干货,第一时间送达 在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个 ...

  5. 风变Python编程13类的学习2

    Python 类的学习2 上一关,我们知道了面向对象编程的重要性,也学习了类的基础知识(1.面向对象编程,2.类的创建和调用,3.创建类的两个关键点) 这一关,我们会拓展类的知识疆界,探索两个类的拓展 ...

  6. Python中的类、实例以及方法,MRO继承解析顺序以及Mixin类

    Contents 1. 什么是类和实例 2. 类的实例方法.类方法和静态方法 3. MRO是什么,描述其查找顺序 4. Mixin是什么,描述其应用场景 5. References 1. 什么是类和实 ...

  7. python编程基础—类与对象

    1.类的声明与定义 Python 是一门面向对象的语言. 面向对象编程 - Object Oriented Programming(简称 OOP)是一种编程思想,在面向对象编程中,把对象作为程序的基本 ...

  8. python之dict

    什么是dict List 和 tuple 可以用来表示顺序集合 例:班里同学的名字和考试的成绩 ['Alice', 'Bob', 'Candy', 'David', 'Ellena'] # List ...

  9. python如何定义类_python中定义类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 类的定义python中,定义类是通过class关键字,例如我们定义一个存储学生信 ...

  10. python 中的类的类方法参数self

    本文转载自:python--类中的self到底有什么作用 python创建的类的函数参数中的self有什么用呢?下面创建一个关于狗的类来说一下: class Dog:# 表示狗的类def __init ...

最新文章

  1. 四次面试:程序员越来越悲催了
  2. oracle数据连接java,java是与Oracle数据连接(jdbc)
  3. 阮一峰react demo代码研究的学习笔记 - React demo1 debug - how is jsx converted to js
  4. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
  5. jquery源码解析:proxy,access,swap,isArraylike详解
  6. Servlet超详解+流程图
  7. Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
  8. 禁止跨域_新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境
  9. 资深解毒:盖码饭和盖浇饭的区别是什么?
  10. 怎样在计算机硬盘里新建文件,高手教你轻松新建文件夹
  11. Libmodbus 移植
  12. python天涯帖子_Python爬虫实战(二):爬取天涯帖子(只看楼主)
  13. 走进社交网络 二期功能完成
  14. cups支持的打印机列表_CUPS共享打印机服务
  15. 大庆金桥:基于 SpreadJS 开发实现计量器具检定证书的在线生成与打印
  16. 健身菜鸟需要掌握哪些基本的健身常识
  17. 奇迹mu修改服务器名,奇迹MU 红名设置调整方案说明
  18. Photoshop Elements 2023 for mac/win(PS简化版2023)​
  19. T1.特殊的毕达哥拉斯三元数(11.19)
  20. 手机充电线接头处容易断裂怎么办?

热门文章

  1. sqlserver2008已成功与服务器建立连接 但在登录过程中发生错误,指定的网络名不可再用(已解决)
  2. Python从入门到数据分析第一篇—Python简介- Python介绍与初探
  3. Word文档打印技巧:如何将文档排版成双面对折打印
  4. 我们整理了20个Python项目,送给正在求职的你
  5. 《机器学习实战》 自制勘误表 中文版第一版2015年9月第11次印刷版
  6. 挖个大坑:挑战用纯micropython写一个nes模拟器(一)
  7. 【MySQL-关键字】MySQL中的desc什么意思?有哪些作用?
  8. 《开学第一课》观后感——幸福
  9. oracle创建用户并授权管理员,Oracle创建用户并授权【数据库】
  10. 视频流服务器-red5的安装与使用