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)

#执行结果
{'赵四': '特别能歪嘴', '刘能': '老, 老四啊...'}

 

posted @ 2023-10-31 11:06  Magiclala  阅读(148)  评论(0编辑  收藏  举报