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)
#执行结果
{'赵四': '特别能歪嘴', '刘能': '老, 老四啊...'}