当前位置: 首页 > news >正文

python字典属于无序序列_五:Python序列之字典

一:字典的概念

字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含键对象和值对象,可以通过“键对象”实现快速获取,删除,更新对应的“值对象”。

“键”是任意的不可改变数据

“值”可以是任意数据,并且可重复

一个字典的定义方式:a = {"name":"zhangsan","age":18,"height":1.75}

二:字典的创建

2.1 通过{},dict{}来创建字典对象

85c37d7b93fc

2.2 通过zip创建字典对象

85c37d7b93fc

2.3 通过fromkeys创建值为空的字典

85c37d7b93fc

三:字典元素的访问

3.1 通过key获取value,若key不存在,则抛出异常

85c37d7b93fc

3.2 通过get()方法获取value

推荐使用该方法,优点是:指定key不存在,返回None;也可以设置指定key不存在时默认返回的对象

85c37d7b93fc

3.3 列出所有的键值对

85c37d7b93fc

3.4 列出所有的key,列出所有的value

85c37d7b93fc

3.5 获取键值对的个数 len()

85c37d7b93fc

3.6 检测一个key是否存在

85c37d7b93fc

四:字典元素的增删改

4.1 增

85c37d7b93fc

4.2 改

使用update()将新字典中所有键值对全部添加到旧字典对象上,如果key有重复,则直接覆盖

85c37d7b93fc

4.3 删

1. delete()删除

2.clear()删除所有键值对

3.pop()删除指定键值对,并返回对应的值对象

85c37d7b93fc

popitem():随即删除和返回该键值对,字典是‘无序可变序列’,因此没有第一个元素,最后一个元素的概念;popitem 弹出随机的项,因为字典没有‘最后的元素’或其他哟管顺序的概念。若想一个接一个的移除并处理项,这个方法就非常有效(因为不用首先获取key的列表)

85c37d7b93fc

五:序列解包

5.1 概念

序列解包可以用于元组,列表,字典。序列解包可以让我们方便的对多个变量赋值

85c37d7b93fc

序列解包用于字典时,默认是对key进行操作;如果需要对键值对操作,则需要使用items();

如果需要对value操作,则需要使用values()

85c37d7b93fc

六:字典核心底层原理(重点)

字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组);数组的每个单元叫做bucket。每个bucket由两部分:一个是键对象的引用,一个是值对象的引用。

由于所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket

85c37d7b93fc

将一个键值对放进字典的底层过程

85c37d7b93fc

假设字典a创建完之后,数组长度为8:

85c37d7b93fc

我们要把 ‘name’ = 'zs' 这个键值对放进 a 中,第一步就需要计算key的散列值。Python可以通过hash()来计算

85c37d7b93fc

由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即‘011’,十进制是3,我们查看偏移量3,对应的bucket是否为空,如果为空,则将键值对放进去,如果不为空,则依次取右边三位作为偏移量,即‘001’,十进制数字是1,再查看偏移量为1的bucket是否为空,直到找到为空的bucket将键值对放进去为止。

85c37d7b93fc

根据key查找‘键值对’的底层过程

85c37d7b93fc

当我们调用 a.get('name')方法,就是根据key‘name’查找到‘键值对’,从而找到对象‘zs’

首先,仍然需要计算‘name’对象的散列表

85c37d7b93fc

算法和存储的底层流程算法一致,就不多赘述

85c37d7b93fc

七:用法总结

1.key必须可散列:

(1) 数字,字符串,元组都是可散列的

(2) 自定义对象需支持下面三点:

支持hash()函数

支持通过__eq__()方法检测相等性

若 a==b 为True,则hash(a)==hash(b)也为True

2.字典在内存中的开销巨大,典型的空间换时间

3.key查询速度很快

4.往字典里添加新建可能导致扩容,导致散列表中key的次序变化,因此,不要在遍历字典的同时进行字典的修改

相关文章:

  • Excel作为数据源TesTNG做数据驱动完整代码
  • ps工具预设_「设计干货」不要浪费时间调整设计效果图了,20款灯光预设送你用...
  • 游戏设计的236个技巧pdf
  • python index函数应用_Python pandas.DataFrame.set_index函数方法的使用
  • Nginx的配置安装和使用
  • pythonpygame游戏代码_使用Python第三方库pygame写个贪吃蛇小游戏
  • onchange事件实现编辑_Openlayer——绘制可编辑几何要素
  • Vue.js 基础学习 v-on 指令
  • python中多线程和多进程的区别_python 多线程和多进程的区别 mutiprocessing theading...
  • super关键字
  • c盘清理工具_学会这几招,让你的电脑从此告别C盘空间不足
  • Python 之 threading
  • c++自底向上算符优先分析_C语言运算符及其优先级汇总表口诀
  • dump分析工具_百因必有果,JVM调优(工具篇)建议收藏
  • java设计模式之代理模式模式总结
  • Android Studio:GIT提交项目到远程仓库
  • angular2开源库收集
  • go append函数以及写入
  • gulp 教程
  • HTTP 简介
  • iOS 系统授权开发
  • JavaScript设计模式与开发实践系列之策略模式
  • JDK9: 集成 Jshell 和 Maven 项目.
  • node和express搭建代理服务器(源码)
  • PAT A1092
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 闭包--闭包作用之保存(一)
  • 判断客户端类型,Android,iOS,PC
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 译米田引理
  • 硬币翻转问题,区间操作
  • ​flutter 代码混淆
  • ​力扣解法汇总946-验证栈序列
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #微信小程序(布局、渲染层基础知识)
  • (03)光刻——半导体电路的绘制
  • (9)STL算法之逆转旋转
  • (Java数据结构)ArrayList
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)JAVA使用POI操作excel
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • .htaccess配置重写url引擎
  • .NET Core跨平台微服务学习资源
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • ??在JSP中,java和JavaScript如何交互?
  • @property @synthesize @dynamic 及相关属性作用探究
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++]打开新世界的大门之C++入门