其他分享
首页 > 其他分享> > 20201225-1 字典的使用

20201225-1 字典的使用

作者:互联网

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://www.cnblogs.com/azxsdcv/p/14187824.html