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

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