20201225 字典的使用
作者:互联网
3. 字典操作
字典一种 key-value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
语法:
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
字典的特性:
● dict 是无序的
● key 必须是唯一的,so 天生去重
通过索引进行查找,列表是通过位置索引,字典中的索引就不是了
'stu1101' 就是索引,叫做key,字典是 key-value 键值对的数据类型
'stu1101' 是学号,后面 "TengLan Wu" 是名字,中间用 冒号 分隔
'stu1101':"TengLan Wu" 就是一条数据,第二条数据,中间用 逗号 隔开
3-1 增加和修改
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print(info)
---> {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
字典是无序的,因为没有下标,字典不需要下标,字典通过 key 进行查找,所以是乱序的
列表有下标,列表的下标就是它的位置信息,必须记录位置
3-1-1 如何获取呢?
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print(info["stu1101"])
---> TengLan Wu
3-1-2 如何修改呢?
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
info["stu1101"] = "武藤兰"
print(info)
--->
{'stu1101': '武藤兰', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
结果就是修改了的
3-1-3 如果 key 本身不存在
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
info["stu1104"] = "CangJingkong" # 如果不存在这个 key
print(info)
--->
{'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': 'CangJingkong'}
结果添加了一条
如果存在就修改,不存在就创建
3-2 删除
3-2-1 del 删除
和列表方式相同,del 是 python 内置的通用方法,想删除谁就删掉谁
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
del info["stu1101"]
print(info)
---> {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
3-2-2 通过 pop 删除
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
info.pop("stu1101")
print(info)
---> {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
3-2-3 popitem() 删除
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
info.popitem() # 随机删除
print(info)
---> {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola'}
# popitem 不建议使用
3-3 查找
3-3-1 存在的情况
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
info['stu1103']
# 存在的情况下,是不会出错的
3-3-2 如果 key 不存在怎么办
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print(info.get('stu1104'))
---> None
print(info.get('stu1103'))
---> XiaoZe Maliya
# 有值就返回,没有就返回 None,这种永远不会出错
3-3-3 如何判断一个字典里是否存在数据?
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print('stu1104' in info)
---> False
print('stu1103' in info)
---> True
# Python2 中的写法:info.has_key("1103")
3-4 多级字典的嵌套及操作
字典可以层层嵌套,最后变成树状结构
av_catalog = {
"欧美":{
"www.youporn.com":["很多免费的,世界最大的","质量一般"],
"www.pornhub.com":["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com":["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,吊比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
字典catalog中 有三个key 欧美 日韩 大陆
["很多免费的,世界最大的","质量一般"] 前面是介绍,后面是点评
3-4-1 如何操作?如何修改 "服务器在国外,慢" ?
av_catalog = {
"欧美":{
"www.youporn.com":["很多免费的,世界最大的","质量一般"],
"www.pornhub.com":["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com":["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,吊比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
av_catalog["大陆"]["1024"][1] = "可以在国内做镜像"
print(av_catalog)
---> {'欧美': {'www.youporn.com': ['很多免费的,世界最大的', '质量一般'],
'www.pornhub.com': ['很多免费的,也很大', '质量比yourporn高点'],
'letmedothistoyou.com': ['多是自拍,高质量图片很多', '资源不多,更新慢'],
'x-art.com': ['质量很高,真的很高', '全部收费,吊比请绕过']},
'日韩': {'tokyo-hot': ['质量怎样不清楚,个人已经不喜欢日韩范了',
'听说是收费的']}, '大陆': {'1024': ['全部免费,真好,好人一生平安', '可以在国内做镜像']}}
# 注意,Key 尽量不要写中文,为了避免编码不一致的问题
3-5 其他字典相关用法
3-5-1 获取 values
info.values() # 获取不包含 key 的 所有值
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print(info.values())
---> dict_values(['TengLan Wu', 'LongZe Luola', 'XiaoZe Maliya'])
3-5-2 获取 keys
info.keys()
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
print(info.keys())
---> dict_keys(['stu1101', 'stu1102', 'stu1103'])
3-5-3-1 setdefault
info.setdefault()
av_catalog = {
"欧美":{
"www.youporn.com":["很多免费的,世界最大的","质量一般"],
"www.pornhub.com":["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com":["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,吊比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
现在想创建一个新的地区
av_catalog.setdefault("台湾",{"www.baidu.com":[1,2]})
前面 台湾 是 key
print(av_catalog)
---> {'欧美': {'www.youporn.com': ['很多免费的,世界最大的', '质量一般'],
'www.pornhub.com': ['很多免费的,也很大', '质量比yourporn高点'],
'letmedothistoyou.com': ['多是自拍,高质量图片很多', '资源不多,更新慢'],
'x-art.com': ['质量很高,真的很高', '全部收费,吊比请绕过']},
'日韩': {'tokyo-hot': ['质量怎样不清楚,个人已经不喜欢日韩范了', '听说是收费的']},
'大陆': {'1024': ['全部免费,真好,好人一生平安', '服务器在国外, 慢']},
'台湾': {'www.baidu.com': [1, 2]}}
3-5-3-2 如果已经存在 setdefault
info.setdefault()
av_catalog = {
"欧美":{
"www.youporn.com":["很多免费的,世界最大的","质量一般"],
"www.pornhub.com":["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com":["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,吊比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
现在想创建一个新的地区
av_catalog.setdefault("大陆",{"www.baidu.com":[1,2]})
print(av_catalog)
---> {'欧美': {'www.youporn.com': ['很多免费的,世界最大的', '质量一般'],
'www.pornhub.com': ['很多免费的,也很大', '质量比yourporn高点'],
'letmedothistoyou.com': ['多是自拍,高质量图片很多', '资源不多,更新慢'],
'x-art.com': ['质量很高,真的很高', '全部收费,吊比请绕过']},
'日韩': {'tokyo-hot': ['质量怎样不清楚,个人已经不喜欢日韩范了',
'听说是收费的']}, '大陆': {'1024': ['全部免费,真好,好人一生平安', '服务器在国外, 慢']}}
# 这时 结果并没有改变~
setdefault,如果key值能取到,就返回;如果取不到,就创建一个新的
3-5-4 info.update()
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
b = {
'stu1101':"Alex",
1:3,
2:5
}
字典 info 和 字典 b 中 有交叉项
info.update(b)
print(info)
---> {'stu1101': 'Alex', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 1: 3, 2: 5}
合并字典,有交叉覆盖,没交叉添加
3-5-5 info.items()
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
b = {
'stu1101':"Alex",
1:3,
2:5
}
info.update(b)
# print(info)
print(info.items())
---> dict_items([('stu1101', 'Alex'),
('stu1102', 'LongZe Luola'), ('stu1103', 'XiaoZe Maliya'),
(1, 3), (2, 5)])
结果变成了一个列表,将一个字典转换成列表
3-5-6-1 fromkeys()
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
b = {
'stu1101':"Alex",
1:3,
2:5
}
info.update(b)
print(info)
c = info.fromkeys([6,7,8])
print(c)
---> {6: None, 7: None, 8: None}
# fromkeys 创建一个新的字典,里面的每一个 key 是列表中的值,后面是空的,空的地方可以想写什么写什么
3-5-6-2 fromkeys()
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
b = {
'stu1101':"Alex",
1:3,
2:5
}
info.update(b)
print(info)
c = info.fromkeys([6,7,8],"test")
print(c)
---> {6: 'test', 7: 'test', 8: 'test'}
# 但实际上,c 和 info 没关系,确实是这样,fromkeys 确实和 info 没有关系
3-5-6-3 fromkeys()
c = dict.fromkeys([6,7,8],"test")
print(c)
---> {6: 'test', 7: 'test', 8: 'test'}
# fromkeys 初始化一个新的字典
3-5-6-4 fromkeys() 的坑
c = dict.fromkeys([6,7,8],[1,{"name":"alex"},444])
print(c)
---> {6: [1, {'name': 'alex'}, 444], 7: [1, {'name': 'alex'}, 444], 8: [1, {'name': 'alex'}, 444]}
c[7][1]['name'] = "Jack Chen"
print(c)
---> {6: [1, {'name': 'Jack Chen'}, 444], 7: [1, {'name': 'Jack Chen'}, 444], 8: [1, {'name': 'Jack Chen'}, 444]}
发现全部都改掉了,其实这和 copy 是一样的,3 个 key 共享一个 内存地址,所以 全部都改了
3-5-7 字典的循环
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
for i in info:
print(i)
---> stu1101
stu1102
stu1103
# 打印的只是 key
3-5-7-1 如果想打印 value
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
for i in info:
print(i,info[i])
---> stu1101 TengLan Wu
stu1102 LongZe Luola
stu1103 XiaoZe Maliya
3-5-7-2 还会看到的一种循环是
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu1103':"XiaoZe Maliya",
}
for k,v in info.items():
print(k,v)
---> stu1101 TengLan Wu
stu1102 LongZe Luola
stu1103 XiaoZe Maliya
和 3-5-7-1 的区别是,上面的要高效很多,因为是通过索引,直接将 value 取出来了
而 通过 item 先将字典 变成了 列表,第一个是 key,第二个是 value; 有一个将 字典转换成列表的过程
如果数据量很大,差别就很大了,所以最好的办法是用上面的
标签:info,stu1103,stu1101,stu1102,Luola,使用,XiaoZe,20201225,字典 来源: https://blog.51cto.com/15149862/2680020