8.字典dict和解构-封装
字典dict
- 与列表的区别:列表可以存储大量的数据类型,但是只能按照顺序存储,数据与数据之间关联性不强
- 字典(dict)是python中唯⼀的⼀个映射类型.他是以{ }括起来的键值对组成.
- 字典中的键值对的保存排列是无序的(不可切片,只能通过key来找value),但每一个键和值(key:value)是对应的,所以在查找值时速度很快,根据键通过哈希算法得出对应值的内存地址
- key必须是不可变的. value没有要求.可以保存任意类型的数据
- 已知的可哈希(不可变)的数据类型: int, str, tuple, bool 不可哈希(可变)的数据类型: list, dict, set
命令格式:
字典名:{'键1':值1,'键2':值2,....}
# 合法的键
dic = {123: 456, True: 666, "id": 1, "name": '杨梅', "age": 19, "stu": ['狼', '羊'], (1, 2, 3): '开开心心'}
print(dic[123])
print(dic[True])
print(dic['id']) #key通常用int或str来表示,当然tuple、bool也可以
print(dic['stu'])
print(dic[(1, 2, 3)])
# 不合法的键
dic = {[1, 2, 3]: '罗志祥'} # 列表list是可变的. 不能作为key
dic = {{1: 2}: "多人"} # 字典dict是可变的. 不能作为key
dic = {{1, 2, 3}: '运动'} # 集合set 是可变的, 不能作为key
一、字典的增删改查
1.增加
1.1定义键值对的同时增加
dic={}
dic['name']=‘杨梅’
dic['age']=12
print(dic)
结果:
{'name': '杨梅', 'age': 12}
1.2通过setdefault设置默认值
当setdefault中第一个参数存在这个字典中就就不进行添加操作,否则就添加
dic={}
a=dic.setdefault('many','3000')
print(a)
print(dic)
结果:
3000
{'many':'3000'}
2.删除
2.1删除指定键值对pop
dic={'many':'3000'}
dic.pop('many') # pop删除有返回值,返回的是被删的值
print(dic)
结果:
dic={}
2.2删除随机键值对popitem
dic={'many':'3000'}
dic.popitem() #随机删除,python3.6中默认删除最后一个
print(dic)
结果:
dic={}
2.3清空字典
dic={'many':'3000'}
dic.clear() #清空字典
3.改
- 注意:对应的键有的话就改值,没有就增加键值对到字典中
3.1单个键值对修改
dic={'many':'3000'}
dic['many']='4000'
print(dic)
结果:
{'many':'4000'}
3.2多个键值对修改update
dic={'many':'3000'}
dic.update({'many':'4000','book':'5000'})
print(dic)
结果:
{'many': '4000', 'book': '5000'}
4.查
4.1通过键来查找值
dic={'many':'3000'}
a=dic['many']
print(a)
结果:
3000
4.2通过get来查找值
dic={'many':'3000'}
a=dic.get('many')
print(a)
结果:
3000
4.3get查找值时可以自定义返回的结果
dic={'many':'3000'}
a=dic.get('many','找不到就太棒了')
print(a)
结果:
3000
dic={'many':'3000'}
a=dic.get('any','找不到就太棒了')
print(a)
结果:
找不到就太棒了
二、字典的其他操作
1.获取字典中所有的键(keys)
dic={'many': '4000', 'book': '5000'}
key_list = dic.keys()
print(key_list)
结果:
dict_keys(['many', 'book'])
# 一个高仿列表,存放的都是字典中的key
2.获取字典中所有的值(values)
dic={'many': '4000', 'book': '5000'}
value_list = dic.values()
print(value_list)
结果:
dict_values(['4000', '5000'])
#一个高仿列表,存放都是字典中的value
3.获取字典中所有的键值对(items)
dic={'many': '4000', 'book': '5000'}
key_value_list = dic.items()
print(key_value_list)
结果:
dict_items([('many', '4000'), ('book', '5000')])
# 一个高仿列表,存放是多个元祖,元祖中第一个是字典中的键,第二个是字典中的值
三、字典遍历
1.循环打印字典中的键
dic={'many':'4000','book':'5000'}
for i in dic.keys()
print(i)
2.循环打印字典中的值
dic={'many':'4000','book':'5000'}
for i in dic.values()
print(i)
3.循环打印字典中的键值对(元组形式)
dic={'many':'4000','book':'5000'}
for i in dic.items()
print(i)
4.循环打印字典中的键和值(解构式)
dic={'many':'4000','book':'5000'}
for k,v in dic.items():
print('这是键',k)
print('这是值',v)
四、解构和封装
- 解构可以将内容分别赋值到变量当中,我们使用解构就能够快速的将值使用
- 把线性结构的元素解开,并顺序的赋给其他变量
- 左边接纳的变量数要和右边解开的元素个数一致
例-解构:
a = 4
b = 5
temp = a
a = b
b = temp
#等价于
a,b = b,a #右边使用了封装,左边使用了解构
例-封装:
t1 = (1,2) #定义元组
t2 = 1,2 #将1和2封装成元组
type(t1)
type(t2)
1.其他解构举例
例:
lst = [3, 5]
first, second = lst
print(first, second)
例:
a,b = 1,2 #正常的封装解构
a,b = (1,2) #元组的封装解构
a,b = [1,2] #列表的封装解构
a,b = {10,20} #set的封装解构
a,b = {'a':10,'b':20} # 非线性结构也可以解构
2.解构时*号的妙用
- 使用*变量名接收,但不能单独使用
- 被*变量名 收集后组成一个列表
lst = list(range(1, 21, 2)) #把1-21之间的数写入列表lst中
head, *mid, tail = lst #执行结果1 [3, 5, 7, 9, 11, 13, 15, 17] 19
*lst2 = lst #不能单独使用
*body, tail = lst #执行结果 [1, 3, 5, 7, 9, 11, 13, 15, 17] 19
head, *tail = lst #执行结果 1 [3, 5, 7, 9, 11, 13, 15, 17, 19]
head, *m1, *m2, tail = lst #只能有一个*变量名
head, *mid, tail = "abcdefghijklmn" #执行结果 a ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] n
type(mid) #mid 类型是列表 list
3.‘’丢弃变量‘’(_下划线的使用)
这是一个惯例,是一个不成文的规定,不是标准
如果不关心一个变量,就可以定义变量的名字为_
_是一个合法的标识符,也可以作为一个有效的变量使用,但是定义成下划线就是希望不要被使用,除非你明确的知道这个数据需要使用
_这个变量本身无任何语义,没有任何可读性,所以不是用来给人用的
Python中很多库,都使用这个变量,使用十分广泛,请不要在不明确变量作用域的情况下使用_导致和库中的冲突
lst = [9,8,7,20]
first, *second = lst
head, *_, tail = lst
print(head)
print(tail) #_是合法的标识符,看到下划线就知道这个变量就是不想被使用
print(_)
结果:
9
20
[8,7]
五、字典嵌套
- 根据键来获取值,若值中包含字典还根据键来获取,若值中包含列表则用索引来获取元素
dic = {
'name':'杨梅',
'age':18,
'wife':[{'name':'林志玲','age':17}],
'children':['熊大','熊二']
}
dic1=dic['name'] #获取杨梅的名字
dic2=dic['wife'][0]['name'] #获取杨梅老婆的名字
dic3=dic['wife'][0]['age'] #获取杨梅老婆的年龄
dic4=dic['children'][0] #获取杨梅的大孩子
8.字典dict和解构-封装的更多相关文章
- python基础类型(字典:dict)
字典的介绍: 字典(dict)Python中唯一的一个映射类型.他是以{}括起来的键值对组成,在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址,然后将key-value保存到这 ...
- 使用 json 模块,使json数据格式与Python字典dict数据格式互相转换,获取数据更加方便
一.定义 JSON 是一种数据格式 使用 javaScript (Java 死鬼破特)对象表示法 二.特点 1.JSON 与 XML格式数据的区别 ====== 两种格式的数据,都是跨语言,跨平台 c ...
- python中几个常见的黑盒子之“字典dict” 与 “集合set”
这里说到"字典dict" 和 "集合set"类型,首先,先了解一下,对于python来说,标准散列机制是有hash函数提供的,对于调用一个__hash__方法: ...
- Python中的元组(tuple)、列表(list)、字典(dict)
-------------------------------更新中-------------------------------------- 元组(tuple): 元组常用小括号表示,即:(),元 ...
- python中字典dict的操作
字典可存储任意类型的对象,由键和值(key - value)组成.字典也叫关联数组或哈希表. dict = {' , 'C' : [1 , 2 , 3] } dict['A'] = 007 # 修改字 ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...
- Python - 字典(dict) 详解 及 代码
字典(dict) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17291329 字典(dict)是表示映射的数据 ...
- Redis的字典(dict)rehash过程源代码解析
Redis的内存存储结构是个大的字典存储,也就是我们通常说的哈希表.Redis小到能够存储几万记录的CACHE,大到能够存储几千万甚至上亿的记录(看内存而定),这充分说明Redis作为缓冲的强大.Re ...
- ES6 学习笔记(一)let,const和解构赋值
let和const let和const是es6新增的两个变量声明关键字,与var的不同点在于: (1)let和const都是块级作用域,在{}内有效,这点在for循环中非常有用,只在循环体内有效.va ...
随机推荐
- 日常使用 ADB 命令
最近项目中经常与安卓设备相连,用到adb命令.整理一下常用命令. wifi控制命令 adb connect IP 若连接失败,可尝试插数据线运行以下两条命令后,方可拔掉数据线,在设备未关闭之前可以直接 ...
- Varnish 6.2.2 的介绍与安装
一.简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 Squid 相比,Varnish 具有性能更高.速度更快 ...
- FRP服务
FRP服务 - Web服务 本服务提供Web内网穿透服务,并且开放端口 443和 80端口. 写在前面:提供公益FRP服务器:frp.dev.boselor.com,服务器在洛杉矶但是请勿用于违法用途 ...
- centos7搭建docker环境
Docker简介 Docker是一种虚拟化技术,用来将你的应用程序及其依赖的环境一起打包成一个镜像发布,使得在任何地方都能获得相同的运行环境. Docker 是一个开源项目,诞生于 2013 年初,最 ...
- pytest文档58-随机执行测试用例(pytest-random-order)
前言 通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果. pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码 ...
- Web调优之IBM JDK+liberty(一): Jmeter pod里压力,50个线程并发测试,调整 -Xms -Xms, Log原来是大问题
1.运行环境 k8s Web服务器: Liberty(IBM J9 JDK),base image : FROM websphere-liberty:20.0.0.3-kernel-java8-ibm ...
- LNOI 2020 退役记
不会爆零了吧嘤嘤嘤 \(Day -7\) 周五正在上化学珂,突然被老师叫出去说省选还有名额,问我报不报名.啊嘞嘞还有一周了告诉我还有名额?经过了激烈的思想斗争,还是决定停课搞一搞,学一回OI好歹看看省 ...
- 使用C++标准库cout输出枚举类型
由于枚举类型呢,是属于一种标签类型,所以在使用std::cout输出的时候,会导致无法匹配数据类型而导致cout函数失败. 这里给的建议呢就是在想要输出的时候,将枚举类型转换为数据类型就可以啦. 如: ...
- scott lock
账户被锁: cmd --->sqlplus /nolog--->conn sys/change_on_install as sysdba;---->alter user scott ...
- 利用ADB命令强制卸载oppo自带浏览器
前言 oppo手机是自带oppo浏览器的,这个自带的浏览器带有oppo推荐的负面新闻很多,而且有时也自动推送一些消息给用户,页面不够简洁,打开浏览器负面内容比较多,所以想要强制卸载oppo浏览器,然后 ...