Python——— 字典

news2024/11/25 7:23:51

   (一)初识字典   

       字典是 键值对 的无序可变序列,字典中的每个元素都是一个 键值对” ,包含: 键对象 值对象 。可以通过 键对象 实现快速获取、 删除、更新对应的“ 值对象
    一个典型的字典的定义方式: a = {'name':'gaoqi', 'age':18, 'job':'programmer'}

        列表中我们通过“下标数字找到对应的对象。字典中通过键对象找到对应的“值对象”。

  • 是任意的不可变数据,比如:整数、浮点数、字符串、元组。 

  •  但列表、字典、集合这些可变对象,不能作为“

  • 不可重复。

  • 可以是任意的数据,并且可重复。

(二)字典的创建

    通过{}dict()来创建字典对象

具体代码:
a ={'name':'baibi','age':18,'job':'programmer'}
b =dict(name='baibi',age=18,job='programmer')
a = dict([("name","baibi"),("age",18)])
c = {}  #空的字典对象
d = dict()  #空的字典对象

通过zip()创建字典对象

具体代码:

k = ['name','age','job']
v = ['baibi',18,'teacher']
d = dict(zip(k,v))
print(d) #{'name': 'baibi', 'age': 18,'job': 'techer'}

通过fromkeys创建值为空的字典

f = dict.fromkeys(['name','age','job'])
print(f)  #结果:{'name': None, 'age':None, 'job': None}

(三)字典元素的访问

通过 [] 获得

若键不存在,则抛出异常
a ={'name':'baibi','age':18,'job':'programmer'}
b = a['name']
print(b)

通过get()方法获得

 优点是:指定键不存在, 返回None ;也可以设定指定键不存在时默认返回的对象。推荐:使用get() 获取 值对象
a ={'name':'baibi','age':18,'job':'programmer'}
b = a.get('name')
c = a.get('gender','不存在')
print(b)
print(c)

列出所有的键值对

a ={'name':'baibi','age':18,'job':'programmer'}
b = a.items()
print(b)  #dict_items([('name', 'baibi'),('age', 18), ('job', 'programmer')])

列出所有的键,列出所有的值

a ={'name':'baibi','age':18,'job':'programmer'}
k = a.keys()
v = a.values()
print(k)  #dict_keys(['name', 'age','job'])
print(v)  #dict_values(['baibi', 18,'programmer'])

len() 键值对的个数

a ={'name':'baibi','age':18,'job':'programmer'}
num = len(a)
print(num)  #3

检测一个是否在字典中

a ={'name':'baibi','age':18,'job':'programmer'}
print("name" in a)  #True

(四)字典元素添加、修改、删除

   给字典新增键值对

如果已经存在,则覆盖旧的键值对; 如果“不存在,则新增键值对”.

a ={'name':'baibi','age':18,'job':'programmer'}
a['address']='毛列街道1号院'
a['age']=16
print(a)
#{'name': 'baibi', 'age': 16, 'job':'programmer', 'address': '毛列街道1号院'}

使用 update()

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

a ={'name':'gaoqi','age':18,'job':'programmer'}
b ={'name':'gaoxixi','money':1000,'gender':'男的'}
a.update(b)
print(a)
#{'name': 'gaoxixi', 'age': 18, 'job':'programmer', 'money': 1000, 'gender': '男的'}

字典中元素的删除

      可以使用 del() 方法;或者 clear() 删除所有键值 对; pop() 删除指定键值对,并返回对应的值对象”。

a ={'name':'baibi','age':18,'job':'programmer'}
del(a['name'])
print(a)       #{'age': 18, 'job':'programmer'}
age = a.pop('age')
print(age)     #18

popitem()

        随机删除和返回该键值对。字典是 无序可变序列 , 因此没有第一个元素、最后一个元素的概念; popitem 弹出随机的项,因为字典并没有" 最后的元素 " 或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用 首先获取键的列表).
具体代码:
a ={'name':'gaoqi','age':18,'job':'programmer'}
r1 = a.popitem()
r2 = a.popitem()
r3 = a.popitem()
print(a)    #{}

(五)序列解包

       序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值。
序列解包用于字典时,默认是对 进行操作; 如果需要对键值对操作,则需要使用items() ;如果需要对 进行操作,则需要使用 values();

 

s = {'name':'baibi','age':18,'job':'teacher'}
name,age,job=s #默认对键进行操作
print(name)    #name
name,age,job=s.items() #对键值对进行操作
print(name)    #('name', 'baibi')
name,age,job=s.values() #对值进行操作
print(name)    #baibi
 

(六)表格数据使用字典和列表存储和访问

姓名年龄薪资城市
赵高1830000北京
王安1920000上海
 
r1 = {"name":"赵高","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"王安","age":19,"salary":20000,"city":"上海"}
tb = [r1,r2]
#获得第二行的人的薪资
print(tb[1].get("salary"))
#打印表中所有的的薪资
for i in range(len(tb)): # i -->0,1,2
    print(tb[i].get("salary"))
#打印表的所有数据
for i in range(len(tb)):
    print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))

(七)字典核心底层原理

        字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元 素的数组),数组的每个单元叫做 bucket 。每个 bucket 有两部分:一 个是键对象的引用,一个是值对象的引用。
        由于,所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket

 

将一个键值对放进字典的底层过程
a = {}
a [ "name" ]= "libai"
假设字典 a 对象创建完后,数组长度为8:

 

      我们要把 ”name”=”libai” 这个键值对放到字典对象 a 中,首先第一 步需要计算键”name” 的散列值。 Python 中可以通过 hash() 来计算。
print(bin(hash("name")))
#-0b100001100010000110000100011111010111110010110100010111111111101
       由于数组长度为 8 ,我们可以拿计算出的散列值的最右边 3 位数字作为偏移量,即“101” ,十进制是数字 5 。我们查看偏移量 5 ,对应的bucket是否为空。如果为空,则将键值对放进去。如果不为空,则依次取右边3 位作为偏移量,即 “100” ,十进制是数字 4 。再查看偏移量为4 bucket 是否为空。直到找到为空的 bucket 将键值对放进去。流程图如下:

 

扩容
python 会根据散列表的拥挤程度扩容。 扩容 指的是 : 创造更大的数组,将原有内容拷贝到新数组
中。 接近2/3时,数组就会扩容。

 

根据键查找 键值对 的底层过程
    一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就简单了。
用法总结 1
字典在内存中开销巨大,典型的空间换时间。
2
键查询速度很快
3
往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改.
4
键必须可散列
1
数字、字符串、元组,都是可散列的
2
自定义对象需要支持下面三点
1 支持 hash() 函数
2 支持通过 __eq__() 方法检测相等性
3 a==b 为真,则 hash(a)==hash(b) 也为真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala入门学习

Scala入门学习 文章目录 Scala入门学习0. 写在前面1. 概述1.1 什么是Scala1.2 Java and Scala 2. Scala简单使用2.1 Scala环境安装2.2 Scala插件安装2.3 Scala第一个案例 0. 写在前面 操作系统:Windows10JDK版本:jdk1.8Maven版本:Maven-3.5.…

调整图片大小需要注意哪些问题?在线改图片大小的方法介绍

调整图片大小:打造完美尺寸的视觉体验 为什么需要调整图片大小? 在现代社交媒体和网络传媒中,图片已经成为信息传递和内容表达的重要元素。然而,不同平台和设备对于图片尺寸有着各自的要求。过大或过小的图片尺寸可能导致加载速…

计算机网络_ 1.3 网络核心 (数据交换_电路交换)

计算机网络_数据交换_电路交换 计算机网络_数据交换_电路交换 计算机网络_数据交换_电路交换 最典型电路交换网络:电话网络电路交换的三个阶段 建立连接(呼叫/电路建立)通信释放连接(拆除电路) 独占资源 电路交换网络…

OSPFv2基础01_整体介绍

目录 1.OSPF简介 2.OSPF工作原理简介 3.OSPF基础概念 3.1 OSPF系统 3.1.1 OSPF路由器分类 3.1.2 OSPF区域 (1)OSPF区域分类 (2)OSPF特殊区域 3.1.3 OSPF路由类型 3.2 OSPF报文 3.2.1 OSPF首部格式 3.2.2 OSPF报文格式 …

【软考】数据库理论

文章目录 一、函数依赖闭包 一、函数依赖闭包 视频连接:https://open.163.com/newview/movie/free?pidEGVFE2HM4&midOGVFE3RKQ 其他的概念: 函数依赖集候选关键字闭包

Ribbon快速入门

1.Ribbon 概述 Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。 轮询 hash 权重 … 简单…

机器视觉-镜头、相机、光源选型以及打光

机器视觉-镜头、相机、光源选型以及打光从理论到实战 关注林中青木微信公众号,获取更多干货,大佬带你飞~

海睿思分享 | ChatGPT梦幻联动,解锁企业数字化转型新可能

在当今这个充满活力和变化的世界里,人工智能 (AI) 的迅速发展正在改变着我们的生活方式。它不仅提高了我们的工作效率,而且正在重新定义我们的日常生活,以前所未有的方式提高了我们的生活质量。其中,以ChatGPT为代表的语言生成模型…

Golang的数据类型及数据类型间转换整理

Golang 更明确的数字类型命名,支持 Unicode,支持常用数据结构。 Go 语言中数据类型分为: 基本数据类型 和 复合数据类型 基本数据类型有:整型、浮点型、布尔型、字符串 复合数据类型有: 数组、切片、结构体、函数、m…

【QT】——定时器QTimer的使用

目录 常见的函数 构造函数 获取/设置定时器间隔时间 启动/停止定时器 信号 设置定时器的时间的两种方法 设置定时器精度 其他函数 静态函数 实例 QTimer是QT框架中的定时器类型,它的使用方法如下: 定义一个调用QTimer对象,调用st…

华为OD机试真题 Python 实现【找出通过车辆最多颜色】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 在一个狭小的路口,每秒只能通过一辆车,假如车辆的颜色只有3种,找出n秒内经过的最多颜色的车辆数量。 三种颜色编…

深度学习在Li电池RUL、SOH和电池热管理中的研究进展与应用

公众号:尤而小屋作者:Peter编辑:Peter 大家好,我是Peter~ 今天给大家分享一篇关于深度学习在Li电池RUL、SOH和电池热管理中的研究进展与应用的文献综述。文献基本信息介绍: 本文系统介绍了Deep Learning深度学习的不同…

大厂题第1辑——虚函数七题精讲之3:纯虚函数

什么是纯虚函数?什么是抽象类?纯虚函数可以提供实现吗?有什么意义? 题6-什么是纯虚函数? C中有两种继承:接口继承和实现继承。二者的第一个区别是:基类都干了些什么? 如果基类啥实…

15.2 BP神经网络实现图像压缩——基于BP神经网络的图像压缩(matlab程序)

1.简述 BP神经网络的图像压缩原理 数字图像压缩实际上是以较少的比特数有损或者无损的来表示原来像素矩阵的一种图像处理技术,实际上就是减少图像数据中的时间冗余,空间冗余,频谱冗余等等作为目的,从而同过减少上述的一种或者多种冗余的信息而达到更加高效的存储与传输数据.图…

目标检测的评估指标

Precision(精确率/查准率):是指在所有被预测为正的样本中,确实是正样本的占比。当Precision越大时,FP越小,此时将其他类别预测为本类别的个数也就越少,可以理解为预测出的正例纯度越高。Precision越高,误检…

LLM驱动的智能体#Mixcopilot的迭代演进

论文: Generative Agents: Interactive Simulacra of Human Behavior shadow 前阵子在一场线下活动,我们展开了对生成式智能体的分享和研讨,同时也介绍了Earth在实现智能体系统的思考和实践。 最近有一篇文章把LLM驱动的智能体的构成讲解的很…

centos7安装图形化界面

一键安装并生效脚本 #!/bin/bash # 安装X(X Window System) yum groupinstall -y "X Window System"# 安装图形界面软件 yum groupinstall -y "GNOME Desktop"# 设置开机进入图形界面 systemctl set-default graphical.target# 进入图形界面 startx安装 …

Windows | [出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)]

Windows | [出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)] C:\WINDOWS\system32\wsl.exe -d Ubuntu-20.04

Verilog基本语法之数据类型

Verilog 是一种用于数字逻辑电路设计的硬件描述语言,可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种行为级(可用于电路的功能描述)描述语言又是一种结构性(可用于元器件及其之间的连接)描述语言。 …

深度了解机器人行业全貌

产品分类 机器人主要可分为工业机器人、服务机器人和特种机器人,主要产品如下图所示。 机器人主要分类 资料来源:36氪、华泰证券《机械设备行业专题研究-商用服务机器人:曙光已现蓝海可期-220105》。 其中工业机器人的主要种类及应用领域如下图所示。 工业机器人主要类型及…