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

小甲鱼——字典

字典是ipython当中唯一实现映射关系的内置类型。

映射关系:就是一一对应

y = {"吕布":"口口布","关羽":"关习习"}
type(y)
<class 'dict'>

这个就是一个字典,我们将冒号左边的就称之为字典的“键”,冒号右边的就是字典的值,

与序列不同的是,序列是通过位置的偏移来存取数据的,而字典是通过键来实现写入和读取的,

在字典中,只要我们提供键就可以获取其对应的值,方法与序列类似

y["吕布"]这段代码的返回值就是   "口口布"

我们可以通过指定一个不存在于字典中的“键”来创建一个新的键值对,

y["刘备"] = "刘baby"那么这段代码的返回值就是:
{'吕布':'口口布','关羽':'关习习','刘备':'刘baby'}

进行字典的深度讲解:

一.创建字典:

1.直接使用大括号或者冒号组合,将映射关系展现出来。

 a = {'吕布':'口口布','关羽':'关习习','刘备':'刘baby'}

2.使用dict()函数,这个函数,它是用来生成字典的,它的每个参数,都是一个对应的键值对,键与值之间,直接使用等号进行挂钩

b = dict(吕布 = "口口布",关羽 = "关习习",刘备 = "刘baby")

#注意#  这种写法不能在键上面添加引号。

3.使用列表作为参数,列表当中的每个元素是使用元组包裹起来的键值对。

c = dict([("吕布","口口布"),("关羽","关习习"),("刘备","刘baby")])

4.就是将第一种方法作为参数传递给dict

d = dict({'吕布':'口口布','关羽':'关习习','刘备':'刘baby'})

5.前面跟第四种是一样的,后面又不太一样

e = dict({'吕布':'口口布','关羽':'关习习'},刘备 = "刘baby")

6.zip()函数,它的作用就是:创建一个聚合多个可迭代对象的迭代器,那么他也是可以作为参数传递给dict()函数,

f = dict(zip(["吕布","关羽","刘备"],["口口布","关习习","刘baby"]))

那么其实这六种他们是等价的

二.增

1.fromkeys(iterable[,values])

它可以使用iterable参数,指定的可迭代对象来创建一个新的字典,并将所有的值初始化为values参数指定的值

d = dict.fromkeys("Fish",250)这段代码的返回值就是:
{'F':250,'i':250,'s':250,'h':250}

现在d就是存放四组映射关系的一个字典。他对于快速初始化一个字典是非常有效果的。

如果需要修改某个键的值,我们可以这么做

d['F'] = 70那么这段代码的返回值就是
{'F':70,'i':250,'s':250,'h':250}

这个F的值就改过来了。

如果在字典中找不到对应的键,同样的操作就会变成增加一个键值对,

d['c'] = 67这段代码的返回值就是:
{'F':70,'i':250,'s':250,'h':250,'c':67}

序列和字典的另一个重大区别:就是序列中元素可以是重复的,而字典中的项也就是我们说的键值对,它一个键就是对应一个值,并不会存在重复的键。如果重复了,就用新的值去覆盖旧的值。

2.删

删除字典中指定的元素,我们可以使用pop方法,

{'F':70,'i':250,'s':250,'h':250,'c':67}d.pop('s')这段代码返回的值就是:250  就是指定的键对应的值我们看一下d 
d的返回值就是:
{'F':70,'i':250,'h':250,'c':67}
此时s就已经不见了

但是,如果pop一个不存在的键,就会抛出异常

d.pop("狗")   例如,你去抛出”狗“,但是里面本来就没有狗,此时就会抛出异常,但是如果你想让python不这么偏激,你可以给他指定一个这个default参数

d.pop("狗","没有")它的返回值就是'没有'
那么在没有的时候,他就会返回我们指定的这个内容就是"没有"

与pop方法类似的还有popitem

它的作用就是,删除最后一个假如字典的键值对,因为在python3.7之后,他就把字典变成有序的了,但是呢,咱们开发的时候一定要记住,并不是所有去执行你这个源代码的这个编译器,它都是python3.7之后的,

{'F':70,'i':250,'s':250,'h':250,'c':67}
d.popitem()
('c',67)#这样就是将最后一个键值对弹出此时的d就是
{'F':70,'i':250,'h':250}

del也可以删除一个指定的键值对

del d['i']d{'F':70,'h':250}

这样就是把i也删掉了

当然,del也可以直接加上字典的名字,把整个字典给干掉

最后,如果我们希望清空字典的内容,我们可以使用clear()方法

d = dict.fromkeys("FishC",250)
d
{'F':250,'i':250,'s':250,'h':250,'c':250}
d.clear()
d
{}

那么此时d就变成了一个空字典。

3.改

只需要指定一个存在于字典中的键,就可以修改其对应的值

d = dict.fromkeys("FishC")  #先使用fromkeys去生成一个字典d{'F':None,'i':None,'s':None,'h':None,'C':None}  #那么一般情况下,他们的返回值就是None#现在我们修改一下's'这个键的值d['s'] = 115d{'F':None,'i':None,'s':115,'h':None,'C':None} 

但是如果我们想同时修改多个键值对,我们可以使用字典的update()方法

它可以支持你,同时给它传入多个键值对,,也可以直接给他传入另一个字典,或者一个包含键值对的可迭代对象,

d.update({'i':105,'h':104})#传入另外一个字典对他进行覆盖
d
{'F':None,'i':None,'s':105,'h':104,'C':None} 
#这个时候这个's','h'就直接更新上去了,还可以这么写:d.update(F = '70',C = '67')d{'F':70,'i':105,'s':115,'h':104,'C':67} 

二.查

最简单的办法 

d['c']'67'

如果我指定的键不在字典中,就会报错,有些时候会被认为是用户体验不佳的表现,所以更好的办法是使用get()方法

get(key[,default])

这个它可以存入一个default方法,指定,当找不到键的时候返回的值

d.get('c',"这里没有c")   #查找c这段代码的返回值就是:‘这里没有c’,不会报错

当我们需要查找一个键是否存在于字典当中时,如果在,返回对应的值,如果不在,就给它一个新的值,那么这个时候我们可以使用一个叫做,setdefault()的方法,

d.setdefault('C',"code")   #查找大写字母C这个键  字典中是存在这个键的,所以后面输入的code并没有用
所以我们这段代码的返回值依旧是  '67'd.setdefault('c',"code")   #查找小写字母c这个键  字典中是不存在这个键的那么这段代码就会返回 "code"#这时候我们将字典打印出来,会发现,字典发生了变化
d{'F':'70','i':'105','h':'104','C':'67','c':'code'}

三.    items(),keys(),values()

三个方法分别用于获取字典的键值对,键和值三者的视图对象

什么是视图对象:

视图对象即字典的动态视图,这就意味者当字典内容发生变化的时候,试图对象的内容也会相应地跟着改变。举个例子:

#创建三个视图对象
keys = d.keys()  #创建的是这个字典的键的视图对象values = d.values()   #创建的是这个字典的值的视图对象items = d.items()itemsdict_items([('F',70),('i',105),('s',115),('h',104),('C','67'),('c','code')])keys
dict_keys(['F','i','s','h','C','c'])valuesdict_values['70',105,115,104,'67','code']上面是我创建的三个视图对象,视图对象就是我们字典的内容发生改变的时候,他们三者也会改变,我们现在修改字典的内容d.pop('c')   #把  c剔除出去'code'
将字典打印出来,发现他改变了
d{'F':'70','i':'105','h':'104','C':'67'}items   #改变了dict_items([('F',70),('i',105),('s',115),('h',104),('C','67')])keys
dict_keys(['F','i','s','h',''C])values   #改变了['70',105,115,104,'67']

字典为了实现浅拷贝,字典和序列一样,使用从copy方法

e = d.copy()
e这段代码的返回值就是:
{'F':'70','i':105,'s':115,'h':104 'C':'67'}

四.内置函数

1.len()

这个内置函数可以获取字典中键值对的数量,

{'F':'70','i':105,'s':115,'h':104 'C':'67'}len(d)5

2.  in    not in 

判断某个键是否存在于字典中

'C'in d
True
'c' not in d 
True

3.字典转换成列表  list(d)

list(d)['F','i','s','h','C']   #这个时候得到的是字典中所有的键构成的列表相当于‘list(d.keys())’#如果要得到所有值,应该使用的是什么list(d.values())
['70',105,115,104,'67']

4.iter()函数

它的作用是将字典的键构成一个迭代器,

e = iter(d)
next(e)
'F'
next(e)
'i'
next(e)
's'
next(e)
'h'
next(e)
'C'

迭代器他只能走一遍,数到最后就会出现一个异常

5,python3.8版本之后,我们可以使用reversed()函数,对字典内部的键值对进行逆向操作。

在之前的版本python因为它的字典的顺序是得不到保障的,所以我们不能使用reverse方法

因为无序,就无所谓的逆向排序,

list(reversed(d.values()))['67',104,115,105,'70']d = {"吕布":{"语文":60,"数学":70,"英语":80},"关羽":{"语文":80,"数学":90,"英语":70}}d
{"吕布":{"语文":60,"数学":70,"英语":80},"关羽":{"语文":80,"数学":90,"英语":70}}这个时候要是想要获取吕布的成绩,就需要做两次索引
d["吕布"]["数学"]
70   #得到的就是70分

 嵌套也可以嵌套一个序列:


d = {"吕布":[60,70,80],"关羽":[80,90,70]#那么第二次索引我们应该相应的换成下标索引值d["吕布"][1]
70

五.字典推导式

d = {'F':70,'i':105,'s':115,'h':104,'C':67}
b = {v:k for k,v in d.items()}
b 
{70:'F',105:'i',115:'s',104:'h',67:'C'}
#这样子就把他们的顺序调换过来了
也可以加上筛选
c = {v:k for k,v in d.items()if v > 100}
c
{105:'i',115:'5',104:'h'}
#两个小于100的就不见了

利用字典推导式,可以利用python求出字符串的编码值

d = {x:ord(x) for x in "FishC"}d{'F':70,'i':105,'s':115,'h':104,'C':67}

容易出错的地方:

d = {x:y for x in [1,3,5] for y in [2,4,6]}d
{1:6,3:6,5:6}

相关文章:

  • 【并发编程实战】内存模型--解决可见性和有序性的利器
  • LoRA用于高效微调的基本原理
  • 【C语言】回调函数 和 部分库函数的用法以及模拟实现
  • 深入理解 MySQL 查询分析工具 EXPLAIN 的使用
  • 【ARMv8/ARMv9 硬件加速系列 4 -- 加解密 Cryptographic Extension 介绍】
  • 通过摄像头检测步频
  • 【C语言】数组参数和指针参数详解
  • MOS参数详解
  • nginx ws长连接配置
  • web端即时通信技术
  • Python for循环中的引用传递和值传递
  • Redis 面试热点(二)
  • 每日一练:攻防世界:Ditf
  • Golang并发控制的三种方案
  • 一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)
  • 【347天】每日项目总结系列085(2018.01.18)
  • Angular数据绑定机制
  • CSS3 变换
  • Date型的使用
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • MySQL主从复制读写分离及奇怪的问题
  • Redis 懒删除(lazy free)简史
  • Service Worker
  • Swoft 源码剖析 - 代码自动更新机制
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • webgl (原生)基础入门指南【一】
  • Windows Containers 大冒险: 容器网络
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 两列自适应布局方案整理
  • 前端面试之闭包
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入手阿里云新服务器的部署NODE
  • 实战|智能家居行业移动应用性能分析
  • 小程序开发中的那些坑
  • 新手搭建网站的主要流程
  • Prometheus VS InfluxDB
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​虚拟化系列介绍(十)
  • # 达梦数据库知识点
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #APPINVENTOR学习记录
  • #单片机(TB6600驱动42步进电机)
  • (6)设计一个TimeMap
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)Linux网络编程入门
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .Net - 类的介绍
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net6 webapi log4net完整配置使用流程
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net下的富文本编辑器FCKeditor的配置方法