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 ...
随机推荐
- Github的一个奇技淫巧
背景 前段时间给 VictoriaLogs 提交了一个 PR: https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4934 本来一切都很顺 ...
- oracle-组合索引字段位置与查询效率之间的关系
Oracle索引组合字段的位置不同,当查询条件不能覆盖索引时,影响查询效率.查询条件是不是索引字段的第一列影响执行计划,实验验证 实验1:查询条件为组合索引的第一列--创建测试表 create tab ...
- 11g GI监听测试增加其他本地端口
11.2 GI中监听器的地址和端口信息被移到了 endpoints_listener.ora中. 使用 endpoints_listener.ora的情况下不应使用lsnrctl管理LISTENER, ...
- Unity - Win平台修改窗口标题
原文参考 主要是通过user32.dll获取窗口句柄, 和Unity没有什么关系 using System; using System.Diagnostics; using System.Runtim ...
- MongoDB 中的锁分析
MongoDB 中的锁 前言 MongoDB 中锁的类型 锁的让渡释放 常见操作使用的锁类型 如果定位 MongoDB 中锁操作 1.查询运行超过20S 的请求 2.批量删除请求大于 20s 的请求 ...
- DFS洛谷4961(求联通块)
说实话这个题审题把我卡了半天,还是我太菜 直接上代码吧 偷个懒用万能库. #include"bits/stdc++.h" using namespace std; int mp[1 ...
- xtrabackup 2.4 的介绍与使用
抄袭转载的太多,请认准原文链接:xtrabackup的介绍与使用 前言 在网上找到教程都是复制粘贴抄袭的,而且还是陈旧资料,不得不说,当前中文互联网环境真是每况愈下. 如果你在网上找 xtraback ...
- Session概述(选自WebX)
http://openwebx.org/docs/Webx3_Guide_Book.html#d0e9084 8.1. Session概述 8.1.1. 什么是Session HTTP协议是无状态的, ...
- Vue源码学习(十四):diff算法patch比对
好家伙, 本篇将会解释要以下效果的实现 1.目标 我们要实现以下元素替换的效果 gif: 以上例子的代码: //创建vnode let vm1 = new Vue({data:{name:'张三' ...
- Qt+FFmpeg播放mp4文件视频
关键词:Qt FFmpeg C++ MP4 视频 源码下载在系列原文地址. 先看效果. 这是一个很简单的mp4文件播放demo,为了简化,没有加入音频数据解析,即只有图像没有声音. 音视频源的播放可以 ...