Python——第二章:字典(dictionary)以及 添、删、改、查
首先, 字典是以键值对的形式进行存储数据的,必须有键【key】,有值【value】
字典的表示方式: {key:value, key2:value, key3:value}
举例:
dic = {"jay": "周杰伦", "金毛狮王": "谢逊"}
val = dic["金毛狮王"] # 和列表的使用区别只是把索引位置换成了key
print(val)
#运行结果
谢逊
*字典的key必须是可哈希的数据类(不可变)
dic = {[]:123}
print(dic)
#执行结果
dic = {[]:123}
^^^^^^^^
TypeError: unhashable type: 'list'
*字典的value可以是任何数据类型
dic = {"汪峰的孩子": ["孩子1", "孩子2"]}
字典的增、删、改、查
字典新增
dic = dict()#创建一个空字典
#给字典赋值'jay'和1两对儿键值
dic['jay'] = "周杰伦"
dic[1] = 123
print(dic)
#输出字典dic
{'jay': '周杰伦', 1: 123}
另一种新增方式dic.setdefault()# 设置默认值方式
这种新增方式叫做设置默认值,如果设置的key不存在,会增加一对儿键值
dic = {'jay': '周杰伦', 1: 123}
dic.setdefault("tom", "胡辣汤")
print(dic)
#运行结果
{'jay': '周杰伦', 1: 123, 'tom': '胡辣汤'}
如果该key的value值已存在,将没有任何效果
dic = {'jay': '周杰伦', 1: 123}
dic.setdefault("jay", "胡辣汤") # 设置默认值. 如果以前已经有了jay了. setdefault就不起作用了
print(dic)
#运行结果
{'jay': '周杰伦', 1: 123}
字典修改
字典中不允许有2个完全相同的key存在,当已有key存在时,就变成了value值的修改操作了
dic['jay'] = "昆凌" # 此时, 字典中已经有了jay. 此时执行的就是修改操作了
print(dic)
#执行结果
{'jay': '昆凌', 1: 123}
字典的查询
print(dic['jay'])
print(dic.get('jay'))
如果出现不存在的key,其中print(dic['jay10010'])的查询方式会报错
print(dic['jay10010']) # 如果key不存在. 程序会报错. 当你确定你的key是没问题的, 可以用
#运行结果
print(dic['jay10010']) # 如果key不存在. 程序会报错. 当你确定你的key是没问题的, 可以用
~~~^^^^^^^^^^^^
KeyError: 'jay10010'
而这种查询方式print(dic.get('jay10086'))会返回None
print(dic.get('jay10086')) # 如果key不存在. 程序返回None. 当不确定你的key的时候. 可以用
#运行结果
None
*这两种查询操作,在实际中被使用的比例是50:50的
当确定你的key是没问题的, 可以用:print(dic['jay10010']) # 如果key不存在. 程序会报错.
当不确定你的key的时候. 可以用:print(dic.get('jay10086')) # 如果key不存在. 程序返回None.
这里特意强调解释一下None的概念
None 是Python中的一个关键字,还被特殊标记了特殊的醒目颜色
None
空还是一个单独的类型NoneType,单纯的就是空, 表示没有的意思。还不能做任何操作
a = None
print(type(a))
#输出结果
<class 'NoneType'>
空字符串与空的区别:
空字符串可以做其他操作

空什么都不可以操作,操作就报错

s = None.xxx
^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'xxx'
空存在的意义就是当出现这种查询不到的情况时,返回一个没有的信息,以提示用户没有任何返回,避免程序报错。
举例:
dic = {
"赵四": "特别能歪嘴",
"刘能": "老, 老四啊...",
"大脚": "跟这个和那个搞对象",
"大脑袋": "瞎折腾....",
}
name = input("请输入你想知道的我们村的人的名字: ")
val = dic.get(name)
print(val)
如果你输入了一个不存在的名字(刘老根),就会返回:None

因此一般我们还会加入if判断,以回复不同的情况,这里就充分用到了None
dic = {
"赵四": "特别能歪嘴",
"刘能": "老, 老四啊...",
"大脚": "跟这个和那个搞对象",
"大脑袋": "瞎折腾....",
}
name = input("请输入你想知道的我们村的人的名字: ")
val = dic.get(name)
if val is None:
print("我门村没这个人~~~")
else:
print(val)
运行后的结果:

字典的删除
dic = {
"赵四": "特别能歪嘴",
"刘能": "老, 老四啊...",
"大脚": "跟这个和那个搞对象",
"大脑袋": "瞎折腾....",
}
dic.pop("大脚") # 根据key去删除
print(dic)
#输出结果
{'赵四': '特别能歪嘴', '刘能': '老, 老四啊...', '大脑袋': '瞎折腾....'}
还有一种强烈不建议的删除方法
del dic['jay']
#执行结果
{1: 123}
*如果需要使用for循环删除,那么不能直接对原字典pop操作,因为在每执行过一次后,字典的大小会发生改变,因此会出现错乱的现象(类似之前的for循环删除列表的逻辑)
举例:删除key中以“大”字开头的
for key in dic:
if key.startswith("大"):
dic.pop(key)
print(dic)
#运行结果
for key in dic:
RuntimeError: dictionary changed size during iteration #在运行过程中,字典的大小发生了改变。
因此我们需要优化代码,先将需要删除的key转存出来,然后执行pop操作
这次循环读取的是列表的字段,删除的是字典中的内容,这里不是循环字典再删除字典
temp = [] # 存放即将要删除的key
for key in dic:
if key.startswith("大"):
temp.append(key)
#dic.pop(key) # dictionary changed size during iteration
for t in temp: # *循环读取的是列表的字段,删除的是字典中的内容,这里不是循环字典再删除字典
dic.pop(t)
print(dic)
#执行结果
{'赵四': '特别能歪嘴', '刘能': '老, 老四啊...'}
Python——第二章:字典(dictionary)以及 添、删、改、查的更多相关文章
- 简学Python第二章__巧学数据结构文件操作
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- python数据类型:字典Dictionary
python数据类型:字典Dictionary 字典是一种可变容器模型,可以存储任意类型对象 键是唯一的,但是值不需要唯一 值可以取任何数据类型,但是键必须是不可变的,如字符串,数字,元组 创建字典: ...
- python学习-62 类属性的增 删 该 查
类属性 1.类属性 类属性又称为静态变量,或者是静态数据.这些数据是与它们所属的类对象绑定的,不依赖于任何类实例. 2.增 删 改 查 class zoo: country = 'china' def ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- Python 第二章-列表和元组
第二章-列表和元组 2.0 在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序列号-即元素的位置, 也称为索引.第一个索引是0,第二个是1,以此类推. ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
随机推荐
- Ds100p -「数据结构百题」61~70
61.P5355 [Ynoi2017]由乃的玉米田 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美. 这排玉米一共有 \(N\) 株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出 ...
- VScode+X11支持连接服务器时支持open3d、openCV、matplotlib等可视化
背景 连接服务器以后,想用open3d可视化点云.matplotlib画点图,但是一直不能用,原因也很简单,就是没有配置GUI传输显示,那肯定是要配置X11相关的东西. 过程 服务器 确保服务器下载了 ...
- pta2023年9月7日 第五期
5月23日 11月14日 有效期3年: 更新方式待定: 双方认证合作CCF编程培训师资认证(PTA)中国计算机学会https://pta.ccf.org.cn/中国科教工作者协会(原:中国青 ...
- 每个后端都应该了解的OpenResty入门以及网关安全实战
简介 在官网上对 OpenResty 是这样介绍的(http://openresty.org): "OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成 ...
- 老派Sql之必要,逆天,我在ef core中使用ado.net!
Wlkr.Core.EFCore 逆天,我在ef core中使用ado.net! 老派Sql之必要 当你开发生涯中基本只用一两种数据库 当你觉得用EF的类写报表时很别扭 当你觉自己的Sql( Serv ...
- iframe用的场景
iframe可用在以下几个场景中: 1:典型系统结构,左侧是功能树,右侧就是一些常见的table或者表单之类的.为了每一个功能,单独分离出来,采用iframe. 2:ajax上传文件. 3:加载别的网 ...
- 关于Xftp7和Xshell7是最新版本但是报错这件事
以win11为例,仅供参考.只能说捣鼓这么久还是建议各位转用MobaXterm. 先说一下,我的解决方法只能说是跳过问题,不是解决问题. <要继续使用此程序 您必须应用最新的更新或使用新版本&g ...
- Atcoder Regular Contest 167
卡 B 下大分了. A. Toasts for Breakfast Party 发现题意是让方差尽可能小,就是让 \(A\) 里的值尽可能接近. 所以从小到大排个序,把 \(A_{N,\dots,N- ...
- 合唱队形(lgP1091)
思路: 先从左到右求一遍最长不下降子序列,再同样方法从右到左求一遍. 然后我们枚举分界点,则总人数就是左边一半加上右边一半的人数. 取最大值,输出答案. 见注释. #include<bits/s ...
- Spring ---三种注入方式
循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...